remo-cli 4.3.6__tar.gz → 4.4.0__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 (922) hide show
  1. remo_cli-4.4.0/.claude/skills/release/SKILL.md +265 -0
  2. remo_cli-4.4.0/.github/actions/publish-web-image/action.yml +99 -0
  3. remo_cli-4.4.0/.github/dependabot.yml +90 -0
  4. remo_cli-4.4.0/.github/workflows/ci.yml +197 -0
  5. remo_cli-4.4.0/.github/workflows/codeql.yml +49 -0
  6. remo_cli-4.4.0/.github/workflows/dependency-review.yml +22 -0
  7. remo_cli-4.4.0/.github/workflows/dev-build.yml +216 -0
  8. remo_cli-4.4.0/.github/workflows/provision.yml +50 -0
  9. remo_cli-4.4.0/.github/workflows/rc-image.yml +140 -0
  10. remo_cli-4.4.0/.github/workflows/release-please.yml +108 -0
  11. remo_cli-4.4.0/.github/workflows/release.yml +229 -0
  12. remo_cli-4.4.0/.github/workflows/smoke-test-cleanup.yml +125 -0
  13. remo_cli-4.4.0/.github/workflows/smoke-test.yml +887 -0
  14. remo_cli-4.4.0/.github/workflows/teardown.yml +41 -0
  15. remo_cli-4.4.0/.release-please-manifest.json +3 -0
  16. remo_cli-4.4.0/.specify/feature.json +3 -0
  17. remo_cli-4.4.0/.specify/memory/constitution.md +600 -0
  18. remo_cli-4.4.0/.specify/templates/plan-template.md +126 -0
  19. remo_cli-4.4.0/AGENTS.md +466 -0
  20. remo_cli-4.4.0/CHANGELOG.md +190 -0
  21. remo_cli-4.4.0/CLAUDE.md +463 -0
  22. remo_cli-4.4.0/CONTRIBUTING.md +286 -0
  23. remo_cli-4.4.0/Dockerfile +71 -0
  24. remo_cli-4.4.0/PKG-INFO +810 -0
  25. remo_cli-4.4.0/README.md +775 -0
  26. remo_cli-4.4.0/ansible/README.md +151 -0
  27. remo_cli-4.4.0/ansible/roles/deacon/defaults/main.yml +11 -0
  28. remo_cli-4.4.0/ansible/roles/nested_docker/tasks/main.yml +262 -0
  29. remo_cli-4.4.0/ansible/roles/ssm_connector/defaults/main.yml +22 -0
  30. remo_cli-4.4.0/ansible/roles/ssm_connector/handlers/main.yml +5 -0
  31. remo_cli-4.4.0/ansible/roles/ssm_connector/tasks/main.yml +237 -0
  32. remo_cli-4.4.0/ansible/roles/ssm_connector/tasks/scan_and_trust_host_key.yml +93 -0
  33. remo_cli-4.4.0/ansible/roles/user_setup/defaults/main.yml +41 -0
  34. remo_cli-4.4.0/ansible/roles/user_setup/templates/remo-host.sh.j2 +940 -0
  35. remo_cli-4.4.0/ansible/ssm_connector_enroll.yml +113 -0
  36. remo_cli-4.4.0/ansible/ssm_connector_unenroll.yml +94 -0
  37. remo_cli-4.4.0/ansible/tasks/configure_dev_tools.yml +146 -0
  38. remo_cli-4.4.0/ansible/tasks/resolve_devcontainer_runtime.yml +79 -0
  39. remo_cli-4.4.0/docker/Dockerfile +156 -0
  40. remo_cli-4.4.0/docker/entrypoint.sh +108 -0
  41. remo_cli-4.4.0/docs/aws.md +411 -0
  42. remo_cli-4.4.0/docs/feature-history.md +27 -0
  43. remo_cli-4.4.0/docs/nested-overlayfs.md +224 -0
  44. remo_cli-4.4.0/docs/provider-plugins.md +130 -0
  45. remo_cli-4.4.0/docs/providers.md +355 -0
  46. remo_cli-4.4.0/docs/proxmox.md +393 -0
  47. remo_cli-4.4.0/docs/ssm-connector.md +250 -0
  48. remo_cli-4.4.0/docs/web-session-interface.md +1247 -0
  49. remo_cli-4.4.0/frontend/src/api/client.test.ts +329 -0
  50. remo_cli-4.4.0/frontend/src/api/client.ts +666 -0
  51. remo_cli-4.4.0/frontend/src/api/generated/openapi.json +3190 -0
  52. remo_cli-4.4.0/frontend/src/api/generated/schema.d.ts +2761 -0
  53. remo_cli-4.4.0/frontend/src/components/AddHostPage.css +89 -0
  54. remo_cli-4.4.0/frontend/src/components/AddHostPage.test.tsx +218 -0
  55. remo_cli-4.4.0/frontend/src/components/AddHostPage.tsx +449 -0
  56. remo_cli-4.4.0/frontend/src/components/AppShell.tsx +361 -0
  57. remo_cli-4.4.0/frontend/src/components/ConfigureConfirmDialog.tsx +47 -0
  58. remo_cli-4.4.0/frontend/src/components/DeleteProjectDialog.test.tsx +60 -0
  59. remo_cli-4.4.0/frontend/src/components/DeleteProjectDialog.tsx +58 -0
  60. remo_cli-4.4.0/frontend/src/components/DiagnosticsSection.css +35 -0
  61. remo_cli-4.4.0/frontend/src/components/DiagnosticsSection.test.tsx +79 -0
  62. remo_cli-4.4.0/frontend/src/components/DiagnosticsSection.tsx +70 -0
  63. remo_cli-4.4.0/frontend/src/components/HostDetailPage.css +546 -0
  64. remo_cli-4.4.0/frontend/src/components/HostDetailPage.test.tsx +368 -0
  65. remo_cli-4.4.0/frontend/src/components/HostDetailPage.tsx +695 -0
  66. remo_cli-4.4.0/frontend/src/components/HostShellPanel.tsx +125 -0
  67. remo_cli-4.4.0/frontend/src/components/JobProgressPanel.test.tsx +191 -0
  68. remo_cli-4.4.0/frontend/src/components/JobProgressPanel.tsx +154 -0
  69. remo_cli-4.4.0/frontend/src/components/PairToSync.tsx +139 -0
  70. remo_cli-4.4.0/frontend/src/components/RebuildConfirmDialog.test.tsx +85 -0
  71. remo_cli-4.4.0/frontend/src/components/RebuildConfirmDialog.tsx +75 -0
  72. remo_cli-4.4.0/frontend/src/components/RemoveHostDialog.tsx +51 -0
  73. remo_cli-4.4.0/frontend/src/components/SessionRail.css +563 -0
  74. remo_cli-4.4.0/frontend/src/components/SessionRail.test.tsx +214 -0
  75. remo_cli-4.4.0/frontend/src/components/SessionRail.tsx +616 -0
  76. remo_cli-4.4.0/frontend/src/components/SettingsPage.css +363 -0
  77. remo_cli-4.4.0/frontend/src/components/SettingsPage.tsx +428 -0
  78. remo_cli-4.4.0/frontend/src/components/TerminalCard.css +426 -0
  79. remo_cli-4.4.0/frontend/src/components/TerminalCard.test.tsx +431 -0
  80. remo_cli-4.4.0/frontend/src/components/TerminalCard.tsx +958 -0
  81. remo_cli-4.4.0/frontend/src/components/TypeToConfirmDialog.tsx +80 -0
  82. remo_cli-4.4.0/frontend/src/components/WorkspacePane.test.tsx +370 -0
  83. remo_cli-4.4.0/frontend/src/components/WorkspacePane.tsx +381 -0
  84. remo_cli-4.4.0/frontend/src/components/railModel.test.ts +390 -0
  85. remo_cli-4.4.0/frontend/src/components/railModel.ts +240 -0
  86. remo_cli-4.4.0/frontend/src/lib/breakpoints.ts +12 -0
  87. remo_cli-4.4.0/frontend/src/main.tsx +35 -0
  88. remo_cli-4.4.0/frontend/src/state/diagnostics.test.ts +233 -0
  89. remo_cli-4.4.0/frontend/src/state/diagnostics.ts +218 -0
  90. remo_cli-4.4.0/frontend/src/state/health.test.ts +114 -0
  91. remo_cli-4.4.0/frontend/src/state/health.ts +192 -0
  92. remo_cli-4.4.0/frontend/src/state/hostStats.test.ts +139 -0
  93. remo_cli-4.4.0/frontend/src/state/hostStats.ts +105 -0
  94. remo_cli-4.4.0/frontend/src/state/latency.ts +75 -0
  95. remo_cli-4.4.0/frontend/src/state/settings.test.ts +446 -0
  96. remo_cli-4.4.0/frontend/src/state/settings.ts +523 -0
  97. remo_cli-4.4.0/frontend/src/state/workspace.ts +457 -0
  98. remo_cli-4.4.0/frontend/src/terminal/RendererAdapter.ts +194 -0
  99. remo_cli-4.4.0/frontend/src/terminal/TerminalConnection.test.ts +442 -0
  100. remo_cli-4.4.0/frontend/src/terminal/TerminalConnection.ts +540 -0
  101. remo_cli-4.4.0/frontend/src/terminal/XtermRenderer.test.ts +73 -0
  102. remo_cli-4.4.0/frontend/src/terminal/XtermRenderer.ts +323 -0
  103. remo_cli-4.4.0/frontend/src/terminal/fitLoop.test.ts +147 -0
  104. remo_cli-4.4.0/frontend/src/terminal/fitLoop.ts +101 -0
  105. remo_cli-4.4.0/frontend/tests/e2e/host-detail.spec.ts +44 -0
  106. remo_cli-4.4.0/frontend/tests/e2e/registry-admin.spec.ts +28 -0
  107. remo_cli-4.4.0/install.sh +454 -0
  108. remo_cli-4.4.0/pyproject.toml +118 -0
  109. remo_cli-4.4.0/specs/010-web-session-interface/contracts/remo-host-protocol.md +238 -0
  110. remo_cli-4.4.0/specs/023-web-registry-sync/contracts/cli-web-sync.md +79 -0
  111. remo_cli-4.4.0/specs/023-web-registry-sync/contracts/mirror-meta.md +24 -0
  112. remo_cli-4.4.0/specs/023-web-registry-sync/contracts/mirror-payload-v3.md +33 -0
  113. remo_cli-4.4.0/specs/023-web-registry-sync/contracts/push-cache-v4.md +25 -0
  114. remo_cli-4.4.0/specs/023-web-registry-sync/contracts/registry-admin-api.md +25 -0
  115. remo_cli-4.4.0/specs/023-web-registry-sync/contracts/setup-registry-get.md +40 -0
  116. remo_cli-4.4.0/specs/024-discovery-resilience/checklists/requirements.md +38 -0
  117. remo_cli-4.4.0/specs/024-discovery-resilience/contracts/instance-out-stale.md +59 -0
  118. remo_cli-4.4.0/specs/024-discovery-resilience/data-model.md +100 -0
  119. remo_cli-4.4.0/specs/024-discovery-resilience/plan.md +192 -0
  120. remo_cli-4.4.0/specs/024-discovery-resilience/quickstart.md +55 -0
  121. remo_cli-4.4.0/specs/024-discovery-resilience/research.md +209 -0
  122. remo_cli-4.4.0/specs/024-discovery-resilience/spec.md +357 -0
  123. remo_cli-4.4.0/specs/024-discovery-resilience/tasks.md +93 -0
  124. remo_cli-4.4.0/specs/025-ssm-connector/checklists/requirements.md +43 -0
  125. remo_cli-4.4.0/specs/025-ssm-connector/contracts/ansible-role.md +71 -0
  126. remo_cli-4.4.0/specs/025-ssm-connector/contracts/cli.md +79 -0
  127. remo_cli-4.4.0/specs/025-ssm-connector/contracts/session-document.md +75 -0
  128. remo_cli-4.4.0/specs/025-ssm-connector/data-model.md +93 -0
  129. remo_cli-4.4.0/specs/025-ssm-connector/issues.md +125 -0
  130. remo_cli-4.4.0/specs/025-ssm-connector/plan.md +127 -0
  131. remo_cli-4.4.0/specs/025-ssm-connector/quickstart.md +81 -0
  132. remo_cli-4.4.0/specs/025-ssm-connector/research.md +185 -0
  133. remo_cli-4.4.0/specs/025-ssm-connector/spec.md +557 -0
  134. remo_cli-4.4.0/specs/025-ssm-connector/tasks.md +176 -0
  135. remo_cli-4.4.0/specs/026-deacon-default-runtime/checklists/requirements.md +38 -0
  136. remo_cli-4.4.0/specs/026-deacon-default-runtime/contracts/remo-host-capabilities.md +19 -0
  137. remo_cli-4.4.0/specs/026-deacon-default-runtime/contracts/runtime-resolution.md +21 -0
  138. remo_cli-4.4.0/specs/026-deacon-default-runtime/data-model.md +30 -0
  139. remo_cli-4.4.0/specs/026-deacon-default-runtime/issues.md +23 -0
  140. remo_cli-4.4.0/specs/026-deacon-default-runtime/plan.md +91 -0
  141. remo_cli-4.4.0/specs/026-deacon-default-runtime/quickstart.md +26 -0
  142. remo_cli-4.4.0/specs/026-deacon-default-runtime/research.md +69 -0
  143. remo_cli-4.4.0/specs/026-deacon-default-runtime/spec.md +365 -0
  144. remo_cli-4.4.0/specs/026-deacon-default-runtime/tasks.md +56 -0
  145. remo_cli-4.4.0/specs/027-provider-plugins/checklists/requirements.md +31 -0
  146. remo_cli-4.4.0/specs/027-provider-plugins/contracts/plugin-contract.md +25 -0
  147. remo_cli-4.4.0/specs/027-provider-plugins/data-model.md +23 -0
  148. remo_cli-4.4.0/specs/027-provider-plugins/issues.md +17 -0
  149. remo_cli-4.4.0/specs/027-provider-plugins/plan.md +62 -0
  150. remo_cli-4.4.0/specs/027-provider-plugins/quickstart.md +12 -0
  151. remo_cli-4.4.0/specs/027-provider-plugins/research.md +43 -0
  152. remo_cli-4.4.0/specs/027-provider-plugins/spec.md +182 -0
  153. remo_cli-4.4.0/specs/027-provider-plugins/tasks.md +41 -0
  154. remo_cli-4.4.0/src/remo_cli/cli/connector.py +145 -0
  155. remo_cli-4.4.0/src/remo_cli/cli/main.py +330 -0
  156. remo_cli-4.4.0/src/remo_cli/cli/plugins.py +51 -0
  157. remo_cli-4.4.0/src/remo_cli/cli/web.py +546 -0
  158. remo_cli-4.4.0/src/remo_cli/core/attach.py +66 -0
  159. remo_cli-4.4.0/src/remo_cli/core/config.py +209 -0
  160. remo_cli-4.4.0/src/remo_cli/core/connector.py +407 -0
  161. remo_cli-4.4.0/src/remo_cli/core/known_hosts.py +322 -0
  162. remo_cli-4.4.0/src/remo_cli/core/platform.py +49 -0
  163. remo_cli-4.4.0/src/remo_cli/core/provider_plugins.py +180 -0
  164. remo_cli-4.4.0/src/remo_cli/core/provider_registry.py +417 -0
  165. remo_cli-4.4.0/src/remo_cli/core/reconcile.py +520 -0
  166. remo_cli-4.4.0/src/remo_cli/core/registry.py +922 -0
  167. remo_cli-4.4.0/src/remo_cli/core/remo_attach_document.json +19 -0
  168. remo_cli-4.4.0/src/remo_cli/core/remo_host_client.py +780 -0
  169. remo_cli-4.4.0/src/remo_cli/core/ssh.py +656 -0
  170. remo_cli-4.4.0/src/remo_cli/core/validation.py +167 -0
  171. remo_cli-4.4.0/src/remo_cli/core/web_adopt.py +2134 -0
  172. remo_cli-4.4.0/src/remo_cli/core/web_drift.py +204 -0
  173. remo_cli-4.4.0/src/remo_cli/core/web_sync.py +1181 -0
  174. remo_cli-4.4.0/src/remo_cli/models/discovery.py +72 -0
  175. remo_cli-4.4.0/src/remo_cli/models/host.py +165 -0
  176. remo_cli-4.4.0/src/remo_cli/models/host_job.py +101 -0
  177. remo_cli-4.4.0/src/remo_cli/models/host_stats.py +171 -0
  178. remo_cli-4.4.0/src/remo_cli/providers/added.py +508 -0
  179. remo_cli-4.4.0/src/remo_cli/providers/aws_descriptor.py +102 -0
  180. remo_cli-4.4.0/src/remo_cli/providers/builtin.py +26 -0
  181. remo_cli-4.4.0/src/remo_cli/providers/connector.py +566 -0
  182. remo_cli-4.4.0/src/remo_cli/providers/incus_descriptor.py +119 -0
  183. remo_cli-4.4.0/src/remo_cli/providers/proxmox_descriptor.py +149 -0
  184. remo_cli-4.4.0/src/remo_cli/web/api/gating.py +61 -0
  185. remo_cli-4.4.0/src/remo_cli/web/api/host_admin.py +274 -0
  186. remo_cli-4.4.0/src/remo_cli/web/api/hosts.py +567 -0
  187. remo_cli-4.4.0/src/remo_cli/web/api/registry_admin.py +794 -0
  188. remo_cli-4.4.0/src/remo_cli/web/api/setup.py +727 -0
  189. remo_cli-4.4.0/src/remo_cli/web/api/terminals.py +585 -0
  190. remo_cli-4.4.0/src/remo_cli/web/app.py +291 -0
  191. remo_cli-4.4.0/src/remo_cli/web/check.py +453 -0
  192. remo_cli-4.4.0/src/remo_cli/web/config.py +341 -0
  193. remo_cli-4.4.0/src/remo_cli/web/discovery.py +653 -0
  194. remo_cli-4.4.0/src/remo_cli/web/health.py +349 -0
  195. remo_cli-4.4.0/src/remo_cli/web/jobs.py +361 -0
  196. remo_cli-4.4.0/src/remo_cli/web/mirror_meta.py +108 -0
  197. remo_cli-4.4.0/src/remo_cli/web/models.py +101 -0
  198. remo_cli-4.4.0/src/remo_cli/web/terminal.py +603 -0
  199. remo_cli-4.4.0/src/remo_cli/web/terminal_registry.py +229 -0
  200. remo_cli-4.4.0/src/remo_cli/web/trust_store.py +133 -0
  201. remo_cli-4.4.0/tests/ansible/test_deacon_role.py +86 -0
  202. remo_cli-4.4.0/tests/ansible/test_devcontainer_runtime_resolution.py +225 -0
  203. remo_cli-4.4.0/tests/ansible/test_ssm_connector_role.py +405 -0
  204. remo_cli-4.4.0/tests/fixtures/remo_fixture_provider/pyproject.toml +18 -0
  205. remo_cli-4.4.0/tests/fixtures/remo_fixture_provider/src/remo_fixture_provider/__init__.py +1 -0
  206. remo_cli-4.4.0/tests/fixtures/remo_fixture_provider/src/remo_fixture_provider/descriptor.py +36 -0
  207. remo_cli-4.4.0/tests/fixtures/remo_fixture_provider/src/remo_fixture_provider/provider.py +99 -0
  208. remo_cli-4.4.0/tests/integration/test_fixture_plugin_e2e.py +83 -0
  209. remo_cli-4.4.0/tests/integration/test_setup_payload_versions.py +279 -0
  210. remo_cli-4.4.0/tests/integration/test_web_adopt_e2e.py +733 -0
  211. remo_cli-4.4.0/tests/integration/test_web_sync_e2e.py +188 -0
  212. remo_cli-4.4.0/tests/unit/cli/test_connector_cmd.py +46 -0
  213. remo_cli-4.4.0/tests/unit/cli/test_connector_lazy_import.py +135 -0
  214. remo_cli-4.4.0/tests/unit/cli/test_main.py +309 -0
  215. remo_cli-4.4.0/tests/unit/cli/test_platform_gate.py +93 -0
  216. remo_cli-4.4.0/tests/unit/cli/test_providers_cmd.py +56 -0
  217. remo_cli-4.4.0/tests/unit/core/test_attach_builder.py +159 -0
  218. remo_cli-4.4.0/tests/unit/core/test_connector_document.py +61 -0
  219. remo_cli-4.4.0/tests/unit/core/test_connector_exposure.py +75 -0
  220. remo_cli-4.4.0/tests/unit/core/test_connector_target.py +200 -0
  221. remo_cli-4.4.0/tests/unit/core/test_platform.py +50 -0
  222. remo_cli-4.4.0/tests/unit/core/test_provider_plugins.py +386 -0
  223. remo_cli-4.4.0/tests/unit/core/test_provider_registry.py +240 -0
  224. remo_cli-4.4.0/tests/unit/core/test_registry_plugin_types.py +168 -0
  225. remo_cli-4.4.0/tests/unit/core/test_remo_host_client.py +1311 -0
  226. remo_cli-4.4.0/tests/unit/core/test_ssh_identity_opts.py +488 -0
  227. remo_cli-4.4.0/tests/unit/core/test_validation.py +394 -0
  228. remo_cli-4.4.0/tests/unit/core/test_web_drift.py +187 -0
  229. remo_cli-4.4.0/tests/unit/core/test_web_push.py +839 -0
  230. remo_cli-4.4.0/tests/unit/core/test_web_sync.py +772 -0
  231. remo_cli-4.4.0/tests/unit/providers/test_added_configure.py +270 -0
  232. remo_cli-4.4.0/tests/unit/providers/test_connector_attach.py +315 -0
  233. remo_cli-4.4.0/tests/unit/providers/test_connector_enroll.py +457 -0
  234. remo_cli-4.4.0/tests/unit/providers/test_proxmox_devcontainer_runtime.py +97 -0
  235. remo_cli-4.4.0/tests/unit/test_ansible_templates.py +1206 -0
  236. remo_cli-4.4.0/tests/unit/test_architecture_provider_literals.py +51 -0
  237. remo_cli-4.4.0/tests/unit/test_dependabot_config.py +141 -0
  238. remo_cli-4.4.0/tests/unit/test_dev_build_workflow.py +103 -0
  239. remo_cli-4.4.0/tests/unit/test_docs_runtime_claims.py +49 -0
  240. remo_cli-4.4.0/tests/unit/test_install_script.py +371 -0
  241. remo_cli-4.4.0/tests/unit/test_release_prerelease_detection.py +207 -0
  242. remo_cli-4.4.0/tests/unit/test_schema_drift.py +891 -0
  243. remo_cli-4.4.0/tests/unit/test_web_image_action.py +155 -0
  244. remo_cli-4.4.0/tests/unit/web/fixtures/hosts_response.json +1 -0
  245. remo_cli-4.4.0/tests/unit/web/test_check_plugins.py +55 -0
  246. remo_cli-4.4.0/tests/unit/web/test_cli_jobs.py +179 -0
  247. remo_cli-4.4.0/tests/unit/web/test_config.py +47 -0
  248. remo_cli-4.4.0/tests/unit/web/test_discovery.py +920 -0
  249. remo_cli-4.4.0/tests/unit/web/test_health_states.py +345 -0
  250. remo_cli-4.4.0/tests/unit/web/test_host_admin_api.py +485 -0
  251. remo_cli-4.4.0/tests/unit/web/test_hosts_mapping.py +154 -0
  252. remo_cli-4.4.0/tests/unit/web/test_mirror_meta.py +92 -0
  253. remo_cli-4.4.0/tests/unit/web/test_payload_equivalence.py +129 -0
  254. remo_cli-4.4.0/tests/unit/web/test_registry_admin_api.py +621 -0
  255. remo_cli-4.4.0/tests/unit/web/test_setup_api.py +905 -0
  256. remo_cli-4.4.0/tests/unit/web/test_setup_dormancy.py +153 -0
  257. remo_cli-4.4.0/tests/unit/web/test_terminals_api.py +538 -0
  258. remo_cli-4.4.0/tests/unit/web/test_trust_store.py +90 -0
  259. remo_cli-4.4.0/uv.lock +1494 -0
  260. remo_cli-4.3.6/.claude/skills/release/SKILL.md +0 -173
  261. remo_cli-4.3.6/.github/dependabot.yml +0 -75
  262. remo_cli-4.3.6/.github/workflows/ci.yml +0 -190
  263. remo_cli-4.3.6/.github/workflows/codeql.yml +0 -45
  264. remo_cli-4.3.6/.github/workflows/dependency-review.yml +0 -18
  265. remo_cli-4.3.6/.github/workflows/dev-build.yml +0 -78
  266. remo_cli-4.3.6/.github/workflows/provision.yml +0 -43
  267. remo_cli-4.3.6/.github/workflows/release-please.yml +0 -104
  268. remo_cli-4.3.6/.github/workflows/release.yml +0 -219
  269. remo_cli-4.3.6/.github/workflows/smoke-test-cleanup.yml +0 -113
  270. remo_cli-4.3.6/.github/workflows/smoke-test.yml +0 -884
  271. remo_cli-4.3.6/.github/workflows/teardown.yml +0 -34
  272. remo_cli-4.3.6/.release-please-manifest.json +0 -3
  273. remo_cli-4.3.6/.specify/feature.json +0 -3
  274. remo_cli-4.3.6/.specify/memory/constitution.md +0 -461
  275. remo_cli-4.3.6/.specify/templates/plan-template.md +0 -125
  276. remo_cli-4.3.6/AGENTS.md +0 -349
  277. remo_cli-4.3.6/CHANGELOG.md +0 -166
  278. remo_cli-4.3.6/CLAUDE.md +0 -346
  279. remo_cli-4.3.6/CONTRIBUTING.md +0 -223
  280. remo_cli-4.3.6/Dockerfile +0 -71
  281. remo_cli-4.3.6/PKG-INFO +0 -656
  282. remo_cli-4.3.6/README.md +0 -630
  283. remo_cli-4.3.6/ansible/README.md +0 -150
  284. remo_cli-4.3.6/ansible/roles/deacon/defaults/main.yml +0 -7
  285. remo_cli-4.3.6/ansible/roles/nested_docker/tasks/main.yml +0 -260
  286. remo_cli-4.3.6/ansible/roles/user_setup/defaults/main.yml +0 -35
  287. remo_cli-4.3.6/ansible/roles/user_setup/templates/remo-host.sh.j2 +0 -299
  288. remo_cli-4.3.6/ansible/tasks/configure_dev_tools.yml +0 -111
  289. remo_cli-4.3.6/docker/Dockerfile +0 -142
  290. remo_cli-4.3.6/docker/entrypoint.sh +0 -88
  291. remo_cli-4.3.6/docs/aws.md +0 -406
  292. remo_cli-4.3.6/docs/feature-history.md +0 -22
  293. remo_cli-4.3.6/docs/nested-overlayfs.md +0 -201
  294. remo_cli-4.3.6/docs/providers.md +0 -349
  295. remo_cli-4.3.6/docs/proxmox.md +0 -372
  296. remo_cli-4.3.6/docs/web-session-interface.md +0 -990
  297. remo_cli-4.3.6/frontend/src/api/client.test.ts +0 -182
  298. remo_cli-4.3.6/frontend/src/api/client.ts +0 -452
  299. remo_cli-4.3.6/frontend/src/api/generated/openapi.json +0 -1205
  300. remo_cli-4.3.6/frontend/src/api/generated/schema.d.ts +0 -1067
  301. remo_cli-4.3.6/frontend/src/components/AppShell.tsx +0 -303
  302. remo_cli-4.3.6/frontend/src/components/PairToSync.tsx +0 -139
  303. remo_cli-4.3.6/frontend/src/components/SessionRail.css +0 -392
  304. remo_cli-4.3.6/frontend/src/components/SessionRail.tsx +0 -358
  305. remo_cli-4.3.6/frontend/src/components/SettingsPage.css +0 -347
  306. remo_cli-4.3.6/frontend/src/components/SettingsPage.tsx +0 -408
  307. remo_cli-4.3.6/frontend/src/components/TerminalCard.css +0 -407
  308. remo_cli-4.3.6/frontend/src/components/TerminalCard.test.tsx +0 -333
  309. remo_cli-4.3.6/frontend/src/components/TerminalCard.tsx +0 -905
  310. remo_cli-4.3.6/frontend/src/components/WorkspacePane.test.tsx +0 -274
  311. remo_cli-4.3.6/frontend/src/components/WorkspacePane.tsx +0 -335
  312. remo_cli-4.3.6/frontend/src/components/railModel.test.ts +0 -121
  313. remo_cli-4.3.6/frontend/src/components/railModel.ts +0 -152
  314. remo_cli-4.3.6/frontend/src/main.tsx +0 -30
  315. remo_cli-4.3.6/frontend/src/state/health.test.ts +0 -77
  316. remo_cli-4.3.6/frontend/src/state/health.ts +0 -139
  317. remo_cli-4.3.6/frontend/src/state/latency.ts +0 -69
  318. remo_cli-4.3.6/frontend/src/state/settings.test.ts +0 -319
  319. remo_cli-4.3.6/frontend/src/state/settings.ts +0 -429
  320. remo_cli-4.3.6/frontend/src/state/workspace.ts +0 -451
  321. remo_cli-4.3.6/frontend/src/terminal/RendererAdapter.ts +0 -137
  322. remo_cli-4.3.6/frontend/src/terminal/TerminalConnection.test.ts +0 -280
  323. remo_cli-4.3.6/frontend/src/terminal/TerminalConnection.ts +0 -463
  324. remo_cli-4.3.6/frontend/src/terminal/XtermRenderer.test.ts +0 -45
  325. remo_cli-4.3.6/frontend/src/terminal/XtermRenderer.ts +0 -278
  326. remo_cli-4.3.6/frontend/src/terminal/fitLoop.ts +0 -77
  327. remo_cli-4.3.6/install.sh +0 -252
  328. remo_cli-4.3.6/pyproject.toml +0 -78
  329. remo_cli-4.3.6/specs/010-web-session-interface/contracts/remo-host-protocol.md +0 -100
  330. remo_cli-4.3.6/src/remo_cli/cli/main.py +0 -304
  331. remo_cli-4.3.6/src/remo_cli/cli/web.py +0 -415
  332. remo_cli-4.3.6/src/remo_cli/core/config.py +0 -202
  333. remo_cli-4.3.6/src/remo_cli/core/known_hosts.py +0 -306
  334. remo_cli-4.3.6/src/remo_cli/core/provider_registry.py +0 -341
  335. remo_cli-4.3.6/src/remo_cli/core/reconcile.py +0 -522
  336. remo_cli-4.3.6/src/remo_cli/core/registry.py +0 -858
  337. remo_cli-4.3.6/src/remo_cli/core/remo_host_client.py +0 -460
  338. remo_cli-4.3.6/src/remo_cli/core/ssh.py +0 -649
  339. remo_cli-4.3.6/src/remo_cli/core/validation.py +0 -159
  340. remo_cli-4.3.6/src/remo_cli/core/web_adopt.py +0 -1995
  341. remo_cli-4.3.6/src/remo_cli/core/web_drift.py +0 -194
  342. remo_cli-4.3.6/src/remo_cli/models/discovery.py +0 -57
  343. remo_cli-4.3.6/src/remo_cli/models/host.py +0 -161
  344. remo_cli-4.3.6/src/remo_cli/providers/added.py +0 -490
  345. remo_cli-4.3.6/src/remo_cli/providers/aws_descriptor.py +0 -100
  346. remo_cli-4.3.6/src/remo_cli/providers/builtin.py +0 -19
  347. remo_cli-4.3.6/src/remo_cli/providers/incus_descriptor.py +0 -118
  348. remo_cli-4.3.6/src/remo_cli/providers/proxmox_descriptor.py +0 -144
  349. remo_cli-4.3.6/src/remo_cli/web/api/hosts.py +0 -225
  350. remo_cli-4.3.6/src/remo_cli/web/api/setup.py +0 -662
  351. remo_cli-4.3.6/src/remo_cli/web/api/terminals.py +0 -506
  352. remo_cli-4.3.6/src/remo_cli/web/app.py +0 -256
  353. remo_cli-4.3.6/src/remo_cli/web/check.py +0 -399
  354. remo_cli-4.3.6/src/remo_cli/web/config.py +0 -265
  355. remo_cli-4.3.6/src/remo_cli/web/discovery.py +0 -484
  356. remo_cli-4.3.6/src/remo_cli/web/health.py +0 -264
  357. remo_cli-4.3.6/src/remo_cli/web/models.py +0 -85
  358. remo_cli-4.3.6/src/remo_cli/web/terminal.py +0 -551
  359. remo_cli-4.3.6/src/remo_cli/web/terminal_registry.py +0 -221
  360. remo_cli-4.3.6/tests/integration/test_setup_payload_versions.py +0 -279
  361. remo_cli-4.3.6/tests/integration/test_web_adopt_e2e.py +0 -731
  362. remo_cli-4.3.6/tests/unit/cli/test_main.py +0 -297
  363. remo_cli-4.3.6/tests/unit/core/test_provider_registry.py +0 -241
  364. remo_cli-4.3.6/tests/unit/core/test_remo_host_client.py +0 -687
  365. remo_cli-4.3.6/tests/unit/core/test_ssh_identity_opts.py +0 -429
  366. remo_cli-4.3.6/tests/unit/core/test_validation.py +0 -380
  367. remo_cli-4.3.6/tests/unit/core/test_web_drift.py +0 -187
  368. remo_cli-4.3.6/tests/unit/core/test_web_push.py +0 -759
  369. remo_cli-4.3.6/tests/unit/providers/test_added_configure.py +0 -226
  370. remo_cli-4.3.6/tests/unit/providers/test_proxmox_devcontainer_runtime.py +0 -83
  371. remo_cli-4.3.6/tests/unit/test_ansible_templates.py +0 -312
  372. remo_cli-4.3.6/tests/unit/test_dependabot_config.py +0 -112
  373. remo_cli-4.3.6/tests/unit/test_schema_drift.py +0 -861
  374. remo_cli-4.3.6/tests/unit/web/fixtures/hosts_response.json +0 -1
  375. remo_cli-4.3.6/tests/unit/web/test_discovery.py +0 -368
  376. remo_cli-4.3.6/tests/unit/web/test_health_states.py +0 -304
  377. remo_cli-4.3.6/tests/unit/web/test_hosts_mapping.py +0 -72
  378. remo_cli-4.3.6/tests/unit/web/test_payload_equivalence.py +0 -122
  379. remo_cli-4.3.6/tests/unit/web/test_setup_api.py +0 -740
  380. remo_cli-4.3.6/tests/unit/web/test_setup_dormancy.py +0 -152
  381. remo_cli-4.3.6/tests/unit/web/test_terminals_api.py +0 -336
  382. remo_cli-4.3.6/uv.lock +0 -1477
  383. {remo_cli-4.3.6 → remo_cli-4.4.0}/.claude/skills/speckit-analyze/SKILL.md +0 -0
  384. {remo_cli-4.3.6 → remo_cli-4.4.0}/.claude/skills/speckit-checklist/SKILL.md +0 -0
  385. {remo_cli-4.3.6 → remo_cli-4.4.0}/.claude/skills/speckit-clarify/SKILL.md +0 -0
  386. {remo_cli-4.3.6 → remo_cli-4.4.0}/.claude/skills/speckit-constitution/SKILL.md +0 -0
  387. {remo_cli-4.3.6 → remo_cli-4.4.0}/.claude/skills/speckit-converge/SKILL.md +0 -0
  388. {remo_cli-4.3.6 → remo_cli-4.4.0}/.claude/skills/speckit-git-commit/SKILL.md +0 -0
  389. {remo_cli-4.3.6 → remo_cli-4.4.0}/.claude/skills/speckit-git-feature/SKILL.md +0 -0
  390. {remo_cli-4.3.6 → remo_cli-4.4.0}/.claude/skills/speckit-git-initialize/SKILL.md +0 -0
  391. {remo_cli-4.3.6 → remo_cli-4.4.0}/.claude/skills/speckit-git-remote/SKILL.md +0 -0
  392. {remo_cli-4.3.6 → remo_cli-4.4.0}/.claude/skills/speckit-git-validate/SKILL.md +0 -0
  393. {remo_cli-4.3.6 → remo_cli-4.4.0}/.claude/skills/speckit-implement/SKILL.md +0 -0
  394. {remo_cli-4.3.6 → remo_cli-4.4.0}/.claude/skills/speckit-plan/SKILL.md +0 -0
  395. {remo_cli-4.3.6 → remo_cli-4.4.0}/.claude/skills/speckit-specify/SKILL.md +0 -0
  396. {remo_cli-4.3.6 → remo_cli-4.4.0}/.claude/skills/speckit-tasks/SKILL.md +0 -0
  397. {remo_cli-4.3.6 → remo_cli-4.4.0}/.claude/skills/speckit-taskstoissues/SKILL.md +0 -0
  398. {remo_cli-4.3.6 → remo_cli-4.4.0}/.devcontainer/devcontainer.json +0 -0
  399. {remo_cli-4.3.6 → remo_cli-4.4.0}/.dockerignore +0 -0
  400. {remo_cli-4.3.6 → remo_cli-4.4.0}/.github/CODEOWNERS +0 -0
  401. {remo_cli-4.3.6 → remo_cli-4.4.0}/.github/codeql/codeql-config.yml +0 -0
  402. {remo_cli-4.3.6 → remo_cli-4.4.0}/.gitignore +0 -0
  403. {remo_cli-4.3.6 → remo_cli-4.4.0}/.maverick/checkpoints/feature/implementation_complete.json +0 -0
  404. {remo_cli-4.3.6 → remo_cli-4.4.0}/.maverick/checkpoints/feature/phase_${{ index }}_complete.json +0 -0
  405. {remo_cli-4.3.6 → remo_cli-4.4.0}/.maverick/checkpoints/feature/validation_complete.json +0 -0
  406. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/.registry +0 -0
  407. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/git/README.md +0 -0
  408. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/git/commands/speckit.git.commit.md +0 -0
  409. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/git/commands/speckit.git.feature.md +0 -0
  410. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/git/commands/speckit.git.initialize.md +0 -0
  411. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/git/commands/speckit.git.remote.md +0 -0
  412. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/git/commands/speckit.git.validate.md +0 -0
  413. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/git/config-template.yml +0 -0
  414. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/git/extension.yml +0 -0
  415. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/git/git-config.yml +0 -0
  416. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/git/scripts/bash/auto-commit.sh +0 -0
  417. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/git/scripts/bash/create-new-feature.sh +0 -0
  418. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/git/scripts/bash/git-common.sh +0 -0
  419. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  420. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  421. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/git/scripts/powershell/create-new-feature.ps1 +0 -0
  422. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  423. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  424. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/extensions.yml +0 -0
  425. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/init-options.json +0 -0
  426. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/integration.json +0 -0
  427. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/integrations/claude.manifest.json +0 -0
  428. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/integrations/speckit.manifest.json +0 -0
  429. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/scripts/bash/check-prerequisites.sh +0 -0
  430. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/scripts/bash/common.sh +0 -0
  431. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/scripts/bash/create-new-feature.sh +0 -0
  432. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/scripts/bash/setup-plan.sh +0 -0
  433. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/scripts/bash/setup-tasks.sh +0 -0
  434. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/scripts/bash/update-agent-context.sh +0 -0
  435. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/templates/agent-file-template.md +0 -0
  436. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/templates/checklist-template.md +0 -0
  437. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/templates/constitution-template.md +0 -0
  438. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/templates/spec-template.md +0 -0
  439. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/templates/tasks-template.md +0 -0
  440. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/workflows/speckit/workflow.yml +0 -0
  441. {remo_cli-4.3.6 → remo_cli-4.4.0}/.specify/workflows/workflow-registry.json +0 -0
  442. {remo_cli-4.3.6 → remo_cli-4.4.0}/LICENSE +0 -0
  443. {remo_cli-4.3.6 → remo_cli-4.4.0}/SECURITY.md +0 -0
  444. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/.ansible-lint +0 -0
  445. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/ansible.cfg +0 -0
  446. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/aws_configure.yml +0 -0
  447. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/aws_resize.yml +0 -0
  448. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/aws_site.yml +0 -0
  449. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/aws_teardown.yml +0 -0
  450. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/group_vars/all.yml +0 -0
  451. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/group_vars/incus_containers.yml +0 -0
  452. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/group_vars/proxmox_containers.yml +0 -0
  453. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/hetzner_configure.yml +0 -0
  454. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/hetzner_provision.yml +0 -0
  455. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/hetzner_resize.yml +0 -0
  456. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/hetzner_site.yml +0 -0
  457. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/hetzner_teardown.yml +0 -0
  458. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/incus_bootstrap.yml +0 -0
  459. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/incus_configure.yml +0 -0
  460. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/incus_provision.yml +0 -0
  461. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/incus_resize.yml +0 -0
  462. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/incus_site.yml +0 -0
  463. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/incus_teardown.yml +0 -0
  464. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/inventory/hosts.yml +0 -0
  465. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/inventory/incus_containers.yml +0 -0
  466. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/proxmox_bootstrap.yml +0 -0
  467. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/proxmox_configure.yml +0 -0
  468. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/proxmox_provision.yml +0 -0
  469. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/proxmox_resize.yml +0 -0
  470. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/proxmox_site.yml +0 -0
  471. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/proxmox_teardown.yml +0 -0
  472. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/requirements.yml +0 -0
  473. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/aws_server/defaults/main.yml +0 -0
  474. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/aws_server/tasks/ebs.yml +0 -0
  475. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/aws_server/tasks/ec2.yml +0 -0
  476. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/aws_server/tasks/main.yml +0 -0
  477. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/aws_server/tasks/patch_manager.yml +0 -0
  478. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/aws_server/tasks/preflight.yml +0 -0
  479. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/aws_server/tasks/security_group.yml +0 -0
  480. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/deacon/tasks/main.yml +0 -0
  481. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/devcontainers/tasks/main.yml +0 -0
  482. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/docker/handlers/main.yml +0 -0
  483. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/docker/tasks/main.yml +0 -0
  484. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/fzf/tasks/main.yml +0 -0
  485. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/github_cli/tasks/main.yml +0 -0
  486. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/hetzner_server/defaults/main.yml +0 -0
  487. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/hetzner_server/tasks/main.yml +0 -0
  488. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/incus_bootstrap/defaults/main.yml +0 -0
  489. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/incus_bootstrap/handlers/main.yml +0 -0
  490. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/incus_bootstrap/tasks/main.yml +0 -0
  491. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/incus_container/defaults/main.yml +0 -0
  492. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/incus_container/handlers/main.yml +0 -0
  493. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/incus_container/meta/main.yml +0 -0
  494. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/incus_container/tasks/main.yml +0 -0
  495. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/incus_container/tasks/preflight.yml +0 -0
  496. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/incus_container_teardown/defaults/main.yml +0 -0
  497. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/incus_container_teardown/meta/main.yml +0 -0
  498. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/incus_container_teardown/tasks/main.yml +0 -0
  499. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/nested_docker/defaults/main.yml +0 -0
  500. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/nested_docker/templates/devcontainer-shim.sh.j2 +0 -0
  501. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/nodejs/defaults/main.yml +0 -0
  502. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/nodejs/files/nodesource-repo.gpg.key +0 -0
  503. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/nodejs/tasks/main.yml +0 -0
  504. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/proxmox_bootstrap/defaults/main.yml +0 -0
  505. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/proxmox_bootstrap/meta/main.yml +0 -0
  506. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/proxmox_bootstrap/tasks/main.yml +0 -0
  507. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/proxmox_container/defaults/main.yml +0 -0
  508. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/proxmox_container/handlers/main.yml +0 -0
  509. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/proxmox_container/meta/main.yml +0 -0
  510. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/proxmox_container/tasks/main.yml +0 -0
  511. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/proxmox_container/tasks/preflight.yml +0 -0
  512. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/proxmox_container_teardown/defaults/main.yml +0 -0
  513. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/proxmox_container_teardown/meta/main.yml +0 -0
  514. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/proxmox_container_teardown/tasks/main.yml +0 -0
  515. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/user_setup/tasks/main.yml +0 -0
  516. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/user_setup/templates/devshell.sh.j2 +0 -0
  517. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/user_setup/templates/project-launch.sh.j2 +0 -0
  518. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/user_setup/templates/project-menu.sh.j2 +0 -0
  519. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/zellij/defaults/main.yml +0 -0
  520. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/zellij/tasks/main.yml +0 -0
  521. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/zellij/templates/config.kdl.j2 +0 -0
  522. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/roles/zellij/templates/layouts/minimal.kdl.j2 +0 -0
  523. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/ssh_configure.yml +0 -0
  524. {remo_cli-4.3.6 → remo_cli-4.4.0}/ansible/tasks/repair_apt_sources.yml +0 -0
  525. {remo_cli-4.3.6 → remo_cli-4.4.0}/docker/compose.example.yml +0 -0
  526. {remo_cli-4.3.6 → remo_cli-4.4.0}/docs/examples/orbstack-cloud-init-tailscale.yaml +0 -0
  527. {remo_cli-4.3.6 → remo_cli-4.4.0}/docs/examples/orbstack-cloud-init.yaml +0 -0
  528. {remo_cli-4.3.6 → remo_cli-4.4.0}/docs/hetzner.md +0 -0
  529. {remo_cli-4.3.6 → remo_cli-4.4.0}/docs/incus.md +0 -0
  530. {remo_cli-4.3.6 → remo_cli-4.4.0}/docs/maintaining-claude-md.md +0 -0
  531. {remo_cli-4.3.6 → remo_cli-4.4.0}/docs/maintaining-generated-types.md +0 -0
  532. {remo_cli-4.3.6 → remo_cli-4.4.0}/docs/remo-web-speckit-input.md +0 -0
  533. {remo_cli-4.3.6 → remo_cli-4.4.0}/docs/remo-web.html +0 -0
  534. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/index.html +0 -0
  535. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/package-lock.json +0 -0
  536. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/package.json +0 -0
  537. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/playwright.config.ts +0 -0
  538. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/playwright.geometry.config.ts +0 -0
  539. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/scripts/check-types-fresh.mjs +0 -0
  540. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/scripts/generate-frame-types.mjs +0 -0
  541. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/scripts/generate-schema-types.mjs +0 -0
  542. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/api/generated/README.md +0 -0
  543. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/api/generated/terminal-frames.d.ts +0 -0
  544. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/api/generated/terminal-frames.json +0 -0
  545. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/api/generated.test.ts +0 -0
  546. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/AppRoot.tsx +0 -0
  547. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/AppShell.css +0 -0
  548. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/AwaitingAdoption.css +0 -0
  549. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/AwaitingAdoption.test.tsx +0 -0
  550. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/AwaitingAdoption.tsx +0 -0
  551. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/OfflineOverlay.css +0 -0
  552. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/OfflineOverlay.tsx +0 -0
  553. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/PairToSync.css +0 -0
  554. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/PairToSync.test.tsx +0 -0
  555. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/ShortcutsModal.css +0 -0
  556. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/ShortcutsModal.tsx +0 -0
  557. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/TopBar.css +0 -0
  558. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/TopBar.tsx +0 -0
  559. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/WorkspacePane.css +0 -0
  560. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/masterLayout.test.ts +0 -0
  561. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/masterLayout.ts +0 -0
  562. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/providerMeta.test.ts +0 -0
  563. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/components/providerMeta.ts +0 -0
  564. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/lib/clipboard.ts +0 -0
  565. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/lib/fullscreen.ts +0 -0
  566. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/state/discovery.test.ts +0 -0
  567. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/state/discovery.ts +0 -0
  568. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/state/fonts.ts +0 -0
  569. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/state/latency.test.ts +0 -0
  570. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/state/useConsoleKeyboard.ts +0 -0
  571. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/state/workspace.test.ts +0 -0
  572. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/terminal/.gitkeep +0 -0
  573. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/terminal/defaultRenderer.ts +0 -0
  574. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/terminal/keymap.test.ts +0 -0
  575. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/terminal/keymap.ts +0 -0
  576. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/test/setup.ts +0 -0
  577. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/theme/fonts.ts +0 -0
  578. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/theme/terminalThemes.test.ts +0 -0
  579. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/theme/terminalThemes.ts +0 -0
  580. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/src/theme/tokens.css +0 -0
  581. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/tests/e2e/fixtures.ts +0 -0
  582. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/tests/e2e/keyboard-routing.spec.ts +0 -0
  583. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/tests/e2e/mobile.spec.ts +0 -0
  584. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/tests/e2e/reconnect.spec.ts +0 -0
  585. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/tests/e2e/terminal-shell-io.spec.ts +0 -0
  586. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/tests/e2e/terminal-tui-compatibility.spec.ts +0 -0
  587. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/tests/e2e/workspace-layout.spec.ts +0 -0
  588. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/tests/geometry/global.d.ts +0 -0
  589. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/tests/geometry/harness/index.html +0 -0
  590. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/tests/geometry/harness/main.tsx +0 -0
  591. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/tests/geometry/terminal-fit.spec.ts +0 -0
  592. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/tsconfig.json +0 -0
  593. {remo_cli-4.3.6 → remo_cli-4.4.0}/frontend/vite.config.ts +0 -0
  594. {remo_cli-4.3.6 → remo_cli-4.4.0}/maverick.yaml +0 -0
  595. {remo_cli-4.3.6 → remo_cli-4.4.0}/project-menu.sh +0 -0
  596. {remo_cli-4.3.6 → remo_cli-4.4.0}/release-please-config.json +0 -0
  597. {remo_cli-4.3.6 → remo_cli-4.4.0}/remo +0 -0
  598. {remo_cli-4.3.6 → remo_cli-4.4.0}/remo.svg +0 -0
  599. {remo_cli-4.3.6 → remo_cli-4.4.0}/run.sh +0 -0
  600. {remo_cli-4.3.6 → remo_cli-4.4.0}/scripts/export_openapi.py +0 -0
  601. {remo_cli-4.3.6 → remo_cli-4.4.0}/scripts/palette-check.sh +0 -0
  602. {remo_cli-4.3.6 → remo_cli-4.4.0}/scripts/setup-aws-oidc.sh +0 -0
  603. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/checklists/requirements.md +0 -0
  604. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/checklists/validation.md +0 -0
  605. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/contracts/playbook-interface.yaml +0 -0
  606. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/contracts/role-interface.yaml +0 -0
  607. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/data-model.md +0 -0
  608. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/plan.md +0 -0
  609. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/quickstart.md +0 -0
  610. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/research.md +0 -0
  611. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/spec.md +0 -0
  612. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/tasks.md +0 -0
  613. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/002-incus-container-support/checklists/requirements.md +0 -0
  614. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/002-incus-container-support/contracts/playbook-interface.yaml +0 -0
  615. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/002-incus-container-support/contracts/role-interface.yaml +0 -0
  616. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/002-incus-container-support/data-model.md +0 -0
  617. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/002-incus-container-support/plan.md +0 -0
  618. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/002-incus-container-support/quickstart.md +0 -0
  619. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/002-incus-container-support/research.md +0 -0
  620. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/002-incus-container-support/spec.md +0 -0
  621. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/002-incus-container-support/tasks.md +0 -0
  622. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/003-python-cli-rewrite/checklists/requirements.md +0 -0
  623. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/003-python-cli-rewrite/data-model.md +0 -0
  624. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/003-python-cli-rewrite/plan.md +0 -0
  625. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/003-python-cli-rewrite/quickstart.md +0 -0
  626. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/003-python-cli-rewrite/research.md +0 -0
  627. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/003-python-cli-rewrite/spec.md +0 -0
  628. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/003-python-cli-rewrite/tasks.md +0 -0
  629. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/004-proxmox-container-support/spec.md +0 -0
  630. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/005-provider-snapshots/checklists/requirements.md +0 -0
  631. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/005-provider-snapshots/contracts/cli-surface.md +0 -0
  632. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/005-provider-snapshots/data-model.md +0 -0
  633. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/005-provider-snapshots/plan.md +0 -0
  634. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/005-provider-snapshots/quickstart.md +0 -0
  635. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/005-provider-snapshots/research.md +0 -0
  636. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/005-provider-snapshots/spec.md +0 -0
  637. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/005-provider-snapshots/tasks.md +0 -0
  638. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/010-web-session-interface/checklists/requirements.md +0 -0
  639. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/010-web-session-interface/contracts/rest-api.md +0 -0
  640. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/010-web-session-interface/contracts/terminal-websocket.md +0 -0
  641. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/010-web-session-interface/data-model.md +0 -0
  642. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/010-web-session-interface/plan.md +0 -0
  643. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/010-web-session-interface/quickstart.md +0 -0
  644. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/010-web-session-interface/research.md +0 -0
  645. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/010-web-session-interface/spec.md +0 -0
  646. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/010-web-session-interface/tasks.md +0 -0
  647. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/011-web-adopt/checklists/requirements.md +0 -0
  648. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/011-web-adopt/contracts/cli-web-adopt.md +0 -0
  649. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/011-web-adopt/contracts/setup-api.md +0 -0
  650. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/011-web-adopt/data-model.md +0 -0
  651. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/011-web-adopt/plan.md +0 -0
  652. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/011-web-adopt/quickstart-results.md +0 -0
  653. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/011-web-adopt/quickstart.md +0 -0
  654. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/011-web-adopt/research.md +0 -0
  655. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/011-web-adopt/spec.md +0 -0
  656. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/011-web-adopt/tasks.md +0 -0
  657. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/contracts/cli-web-adopt.md +0 -0
  658. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/contracts/pairing-api.md +0 -0
  659. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/contracts/setup-api.md +0 -0
  660. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/data-model.md +0 -0
  661. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/plan.md +0 -0
  662. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/quickstart.md +0 -0
  663. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/research.md +0 -0
  664. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/spec.md +0 -0
  665. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/tasks.md +0 -0
  666. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/013-managed-instance-tags/contracts/cli-sync.md +0 -0
  667. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/013-managed-instance-tags/contracts/marker-commands.md +0 -0
  668. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/013-managed-instance-tags/data-model.md +0 -0
  669. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/013-managed-instance-tags/plan.md +0 -0
  670. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/013-managed-instance-tags/quickstart.md +0 -0
  671. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/013-managed-instance-tags/research.md +0 -0
  672. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/013-managed-instance-tags/spec.md +0 -0
  673. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/013-managed-instance-tags/tasks.md +0 -0
  674. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/014-register-ssh-host/contracts/add-command.md +0 -0
  675. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/014-register-ssh-host/contracts/remove-command.md +0 -0
  676. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/014-register-ssh-host/data-model.md +0 -0
  677. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/014-register-ssh-host/plan.md +0 -0
  678. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/014-register-ssh-host/quickstart.md +0 -0
  679. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/014-register-ssh-host/research.md +0 -0
  680. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/014-register-ssh-host/spec.md +0 -0
  681. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/014-register-ssh-host/tasks.md +0 -0
  682. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/015-registry-v2/checklists/requirements.md +0 -0
  683. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/015-registry-v2/contracts/mirror-payload-v2.md +0 -0
  684. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/015-registry-v2/contracts/registry-accessor-api.md +0 -0
  685. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/015-registry-v2/contracts/registry-file-v2.md +0 -0
  686. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/015-registry-v2/data-model.md +0 -0
  687. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/015-registry-v2/plan.md +0 -0
  688. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/015-registry-v2/quickstart.md +0 -0
  689. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/015-registry-v2/research.md +0 -0
  690. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/015-registry-v2/spec.md +0 -0
  691. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/015-registry-v2/tasks.md +0 -0
  692. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/016-sync-reconcile/checklists/requirements.md +0 -0
  693. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/016-sync-reconcile/contracts/cli-sync.md +0 -0
  694. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/016-sync-reconcile/contracts/provider-probe.md +0 -0
  695. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/016-sync-reconcile/data-model.md +0 -0
  696. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/016-sync-reconcile/plan.md +0 -0
  697. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/016-sync-reconcile/quickstart.md +0 -0
  698. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/016-sync-reconcile/research.md +0 -0
  699. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/016-sync-reconcile/spec.md +0 -0
  700. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/016-sync-reconcile/tasks.md +0 -0
  701. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/checklists/requirements.md +0 -0
  702. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/contracts/cli-web-push.md +0 -0
  703. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/contracts/cli-web-status.md +0 -0
  704. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/contracts/revocation.md +0 -0
  705. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/contracts/setup-status-marker.md +0 -0
  706. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/data-model.md +0 -0
  707. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/plan.md +0 -0
  708. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/quickstart.md +0 -0
  709. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/research.md +0 -0
  710. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/spec.md +0 -0
  711. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/tasks.md +0 -0
  712. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/018-provider-abstraction/baseline-notes.md +0 -0
  713. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/018-provider-abstraction/checklists/requirements.md +0 -0
  714. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/018-provider-abstraction/contracts/cli-surface.md +0 -0
  715. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/018-provider-abstraction/contracts/errors.md +0 -0
  716. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/018-provider-abstraction/contracts/lifecycle-templates.md +0 -0
  717. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/018-provider-abstraction/contracts/provider-protocol.md +0 -0
  718. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/018-provider-abstraction/contracts/sync-merge.md +0 -0
  719. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/018-provider-abstraction/data-model.md +0 -0
  720. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/018-provider-abstraction/plan.md +0 -0
  721. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/018-provider-abstraction/quickstart.md +0 -0
  722. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/018-provider-abstraction/research.md +0 -0
  723. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/018-provider-abstraction/spec.md +0 -0
  724. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/018-provider-abstraction/tasks.md +0 -0
  725. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/checklists/requirements.md +0 -0
  726. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/contracts/cli-surface-delta.md +0 -0
  727. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/contracts/docs-structure-check.md +0 -0
  728. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/data-model.md +0 -0
  729. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/plan.md +0 -0
  730. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/quickstart.md +0 -0
  731. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/research.md +0 -0
  732. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/spec.md +0 -0
  733. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/tasks.md +0 -0
  734. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/020-openapi-type-generation/checklists/requirements.md +0 -0
  735. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/020-openapi-type-generation/contracts/drift-checks.md +0 -0
  736. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/020-openapi-type-generation/contracts/terminal-frames-v1.md +0 -0
  737. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/020-openapi-type-generation/data-model.md +0 -0
  738. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/020-openapi-type-generation/plan.md +0 -0
  739. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/020-openapi-type-generation/quickstart.md +0 -0
  740. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/020-openapi-type-generation/research.md +0 -0
  741. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/020-openapi-type-generation/spec.md +0 -0
  742. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/020-openapi-type-generation/tasks.md +0 -0
  743. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/021-cli-plane-separation/contracts/cli-surface.md +0 -0
  744. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/021-cli-plane-separation/contracts/descriptor-schema.md +0 -0
  745. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/021-cli-plane-separation/data-model.md +0 -0
  746. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/021-cli-plane-separation/plan.md +0 -0
  747. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/021-cli-plane-separation/quickstart.md +0 -0
  748. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/021-cli-plane-separation/research.md +0 -0
  749. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/021-cli-plane-separation/spec.md +0 -0
  750. {remo_cli-4.3.6 → remo_cli-4.4.0}/specs/021-cli-plane-separation/tasks.md +0 -0
  751. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/__init__.py +0 -0
  752. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/__main__.py +0 -0
  753. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/cli/__init__.py +0 -0
  754. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/cli/added.py +0 -0
  755. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/cli/cp.py +0 -0
  756. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/cli/providers/__init__.py +0 -0
  757. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/cli/providers/factory.py +0 -0
  758. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/cli/shell.py +0 -0
  759. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/core/__init__.py +0 -0
  760. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/core/ansible_runner.py +0 -0
  761. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/core/completion.py +0 -0
  762. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/core/errors.py +0 -0
  763. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/core/lifecycle.py +0 -0
  764. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/core/output.py +0 -0
  765. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/core/picker.py +0 -0
  766. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/core/provider_protocol.py +0 -0
  767. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/core/rsync.py +0 -0
  768. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/core/snapshot.py +0 -0
  769. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/core/version.py +0 -0
  770. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/models/__init__.py +0 -0
  771. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/models/capability.py +0 -0
  772. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/models/session_target.py +0 -0
  773. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/models/snapshot.py +0 -0
  774. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/providers/__init__.py +0 -0
  775. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/providers/aws.py +0 -0
  776. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/providers/hetzner.py +0 -0
  777. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/providers/hetzner_descriptor.py +0 -0
  778. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/providers/incus.py +0 -0
  779. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/providers/proxmox.py +0 -0
  780. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/web/__init__.py +0 -0
  781. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/web/api/__init__.py +0 -0
  782. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/web/api/pairing.py +0 -0
  783. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/web/frames.py +0 -0
  784. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/web/logging_config.py +0 -0
  785. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/web/operator_auth.py +0 -0
  786. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/web/pairing.py +0 -0
  787. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/web/ssh_master.py +0 -0
  788. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/web/state.py +0 -0
  789. {remo_cli-4.3.6 → remo_cli-4.4.0}/src/remo_cli/web/tokens.py +0 -0
  790. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/__init__.py +0 -0
  791. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/ansible/__init__.py +0 -0
  792. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/ansible/test_apt_sources_repair.py +0 -0
  793. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/ansible/test_authorized_keys_bootstrap.py +0 -0
  794. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/ansible/test_remo_host_idempotency.py +0 -0
  795. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/ansible/test_ssh_configure_connection.py +0 -0
  796. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/ansible/test_user_setup_docker_group.py +0 -0
  797. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/conftest.py +0 -0
  798. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/image/__init__.py +0 -0
  799. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/image/test_docker_image.py +0 -0
  800. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/integration/__init__.py +0 -0
  801. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/integration/_nine_terminal_fixture.py +0 -0
  802. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/integration/fish_completion.sh +0 -0
  803. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/integration/orbstack-cloud-init.yml +0 -0
  804. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/integration/orbstack.sh +0 -0
  805. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/integration/test_nine_terminals.py +0 -0
  806. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/integration/test_nine_terminals_soak.py +0 -0
  807. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/integration/test_registry_concurrency.py +0 -0
  808. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/integration/test_remo_host_e2e.py +0 -0
  809. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/integration/test_security_rejections.py +0 -0
  810. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/integration/test_sync_reconcile.py +0 -0
  811. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/integration/test_terminal_attach.py +0 -0
  812. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/integration/test_web_cli_parity.py +0 -0
  813. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/perf/__init__.py +0 -0
  814. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/perf/test_latency.py +0 -0
  815. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/perf/test_registry_perf.py +0 -0
  816. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/__init__.py +0 -0
  817. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/__init__.py +0 -0
  818. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/providers/test_aws_snapshot.py +0 -0
  819. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/providers/test_hetzner_snapshot.py +0 -0
  820. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/providers/test_incus_snapshot.py +0 -0
  821. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/providers/test_incus_sync_all.py +0 -0
  822. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/providers/test_proxmox_snapshot.py +0 -0
  823. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/providers/test_proxmox_sync_all.py +0 -0
  824. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/surface_baseline.py +0 -0
  825. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/test_add_cmd.py +0 -0
  826. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/test_cli_uniformity.py +0 -0
  827. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/test_configure_cmd.py +0 -0
  828. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/test_cp.py +0 -0
  829. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/test_remove_cmd.py +0 -0
  830. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/test_shell.py +0 -0
  831. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/test_shell_added.py +0 -0
  832. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/test_startup_imports.py +0 -0
  833. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/test_surface_preservation.py +0 -0
  834. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/cli/test_web_adopt_cmd.py +0 -0
  835. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/__init__.py +0 -0
  836. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_ansible_runner.py +0 -0
  837. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_completion.py +0 -0
  838. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_config.py +0 -0
  839. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_errors.py +0 -0
  840. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_known_hosts.py +0 -0
  841. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_lifecycle.py +0 -0
  842. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_migration_tagging_notice.py +0 -0
  843. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_output.py +0 -0
  844. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_picker.py +0 -0
  845. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_reconcile.py +0 -0
  846. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_registry_format.py +0 -0
  847. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_registry_locking.py +0 -0
  848. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_registry_migration.py +0 -0
  849. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_rsync.py +0 -0
  850. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_snapshot.py +0 -0
  851. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_ssh.py +0 -0
  852. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_ssh_added.py +0 -0
  853. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_ssh_controlpath.py +0 -0
  854. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_version.py +0 -0
  855. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_web_adopt_authorize.py +0 -0
  856. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_web_adopt_code.py +0 -0
  857. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_web_adopt_payload.py +0 -0
  858. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_web_adopt_trust.py +0 -0
  859. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/core/test_web_push_self_heal.py +0 -0
  860. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/models/__init__.py +0 -0
  861. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/models/test_capability.py +0 -0
  862. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/models/test_discovery.py +0 -0
  863. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/models/test_session_target.py +0 -0
  864. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/__init__.py +0 -0
  865. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/fake_provider.py +0 -0
  866. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_added_add.py +0 -0
  867. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_added_provider_guard.py +0 -0
  868. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_added_update_remove.py +0 -0
  869. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_added_verify.py +0 -0
  870. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_aws_provider_protocol.py +0 -0
  871. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_aws_snapshot.py +0 -0
  872. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_aws_sync.py +0 -0
  873. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_aws_upgrade_resize.py +0 -0
  874. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_hetzner_entry_adapters.py +0 -0
  875. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_hetzner_http.py +0 -0
  876. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_hetzner_label.py +0 -0
  877. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_hetzner_resize.py +0 -0
  878. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_hetzner_snapshot.py +0 -0
  879. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_hetzner_sync.py +0 -0
  880. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_host_user_consistency.py +0 -0
  881. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_incus_entry_adapters.py +0 -0
  882. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_incus_marker.py +0 -0
  883. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_incus_resize.py +0 -0
  884. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_incus_snapshot.py +0 -0
  885. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_incus_sync.py +0 -0
  886. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_missing_sdk.py +0 -0
  887. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_provider_conformance.py +0 -0
  888. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_provider_registry_entries.py +0 -0
  889. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_proxmox_marker.py +0 -0
  890. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_proxmox_provider_protocol.py +0 -0
  891. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_proxmox_resize.py +0 -0
  892. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_proxmox_snapshot.py +0 -0
  893. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/providers/test_proxmox_sync.py +0 -0
  894. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/test_architecture.py +0 -0
  895. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/test_devcontainer_shim.py +0 -0
  896. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/test_docs_examples.py +0 -0
  897. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/test_docs_structure.py +0 -0
  898. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/test_host_model.py +0 -0
  899. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/test_host_ssh_type.py +0 -0
  900. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/test_lockfile_version.py +0 -0
  901. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/test_workflow_action_pins.py +0 -0
  902. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/__init__.py +0 -0
  903. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/_pairing_support.py +0 -0
  904. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/conftest.py +0 -0
  905. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/fixtures/sessions_response.json +0 -0
  906. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/test_backpressure.py +0 -0
  907. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/test_check.py +0 -0
  908. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/test_csp.py +0 -0
  909. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/test_discovery_refresh_force.py +0 -0
  910. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/test_frames.py +0 -0
  911. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/test_lazy_import.py +0 -0
  912. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/test_log_redaction.py +0 -0
  913. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/test_mint_gating.py +0 -0
  914. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/test_operator_auth.py +0 -0
  915. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/test_pairing.py +0 -0
  916. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/test_pairing_origin.py +0 -0
  917. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/test_registry_readonly.py +0 -0
  918. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/test_service_identity_selection.py +0 -0
  919. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/test_setup_auth.py +0 -0
  920. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/test_state.py +0 -0
  921. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/test_terminal_resize.py +0 -0
  922. {remo_cli-4.3.6 → remo_cli-4.4.0}/tests/unit/web/test_tokens.py +0 -0
@@ -0,0 +1,265 @@
1
+ ---
2
+ name: release
3
+ description: Cut a remo release — drive the release-please stable release PR, or build/validate/publish a pre-release (RC) — with a mandatory local "test before PyPI" gate and explicit approval before anything is tagged, merged, or published.
4
+ argument-hint: "[stable | rc [X.Y.ZrcN]] — omit to be asked"
5
+ metadata:
6
+ author: remo
7
+ ---
8
+
9
+ # Release
10
+
11
+ Operationalizes remo's two-lane release process (see
12
+ [CONTRIBUTING.md](../../../CONTRIBUTING.md) → Release Process). Pairs with the
13
+ release-please integration.
14
+
15
+ **Non-negotiable safety rules — apply in every mode:**
16
+
17
+ - **Publishing to PyPI is irreversible.** A version, once uploaded, can never be
18
+ replaced. Run the local build + smoke gate (Step V below) before anything that
19
+ reaches PyPI — a stable release PR merge, or RC outcome **D**.
20
+ - **A `v*` tag publishes to PyPI. An `rc-*` tag does not.** `release.yml`
21
+ triggers on `tags: v*`; the GitHub-pre-release path (RC outcome **B**) tags
22
+ `rc-<version>` and never uploads. Check which namespace you are in before
23
+ pushing anything.
24
+ - **Never** `git push` a tag, `git push` a version-bump commit, or `gh pr merge`
25
+ a release PR **without explicit user approval in the current turn.** Approval
26
+ from an earlier task does not carry over. Dispatching `dev-build.yml` is not in
27
+ this class — it neither commits nor uploads — but say what it will tag.
28
+ - Work only from a **clean working tree** on an **up-to-date `main`**. If the
29
+ tree is dirty or `main` is behind `origin/main`, stop and surface it. A dirty
30
+ file the operator owns and you did not touch is theirs: report it, never
31
+ revert it.
32
+ - Prefer testing **without** publishing. "Publish a pre-release" in this repo
33
+ means outcome **B** (GitHub) unless the user says PyPI. Never infer PyPI from
34
+ the word "publish".
35
+
36
+ ## Step 0 — Determine the mode
37
+
38
+ From the argument, or by asking the user:
39
+
40
+ - **`stable`** — drive the release-please release PR to a published stable release.
41
+ - **`rc`** — build/validate a pre-release, optionally publishing it.
42
+
43
+ Then run `git fetch origin` and verify `git status` is clean and `main` is
44
+ up to date (`git rev-parse HEAD` == `git rev-parse origin/main`).
45
+
46
+ ---
47
+
48
+ ## Stable lane (release-please owns the version + tag)
49
+
50
+ 1. `git checkout main && git pull --ff-only`.
51
+ 2. Find the open release PR (release-please titles it `chore(main): release X.Y.Z`
52
+ and pushes it to a `release-please--…` branch). Match on either signal —
53
+ do **not** pass the title to `--search`, whose parser silently drops
54
+ `chore(main):` and returns zero results even when the PR exists:
55
+ ```bash
56
+ gh pr list --state open --limit 100 --json number,title,headRefName,url --jq \
57
+ '.[] | select((.headRefName | startswith("release-please--"))
58
+ or (.title | startswith("chore(main): release")))
59
+ | "\(.number)\t\(.title)\t\(.url)"'
60
+ ```
61
+ If none exists, tell the user release-please has not opened one (no
62
+ releasable `feat:`/`fix:` commits since the last release) and **stop**.
63
+ Before concluding that, sanity-check with a bare `gh pr list --state open`:
64
+ a filter bug and a genuinely absent PR look identical from here, and
65
+ wrongly reporting "no release PR" strands a real one.
66
+ 3. Show the proposed bump + changelog for review. `gh pr diff` takes no
67
+ pathspec (`gh pr diff <n> -- <files>` fails with "accepts at most 1 arg"),
68
+ so select the files from the API instead:
69
+ ```bash
70
+ gh api repos/{owner}/{repo}/pulls/<number>/files --paginate --jq \
71
+ '.[] | select(.filename == "pyproject.toml" or .filename == "CHANGELOG.md")
72
+ | "=== \(.filename) ===\n\(.patch)"'
73
+ ```
74
+ Read the `⚠ BREAKING CHANGES` block carefully — it is what drives a major
75
+ bump, and a spurious entry there is the usual cause of an unintended one.
76
+ 4. **Run the validation gate (Step V) on the PR's head branch** so you build the
77
+ exact version that will publish.
78
+ 5. **Only on explicit approval**, merge it (release-please then tags `vX.Y.Z`,
79
+ which triggers `release.yml` to publish to PyPI + GHCR):
80
+ ```bash
81
+ gh pr merge <number> --squash
82
+ ```
83
+ Before merging, confirm the `RELEASE_PLEASE_TOKEN` secret is set — without it
84
+ the tag will not trigger the publish. If it's missing, warn the user and let
85
+ them decide.
86
+ 6. Return to `main`, `git pull --ff-only`, report the new tag, and offer to watch
87
+ the release CI. `gh run watch` needs an explicit run id outside a TTY:
88
+ ```bash
89
+ gh run watch "$(gh run list --workflow=release.yml --limit 1 \
90
+ --json databaseId --jq '.[0].databaseId')"
91
+ ```
92
+
93
+ ---
94
+
95
+ ## RC lane (manual — release-please stays out)
96
+
97
+ **Two tag namespaces, and confusing them is the one unrecoverable mistake here:**
98
+
99
+ | Tag | Created by | Publishes to |
100
+ |-----|-----------|--------------|
101
+ | `rc-X.Y.ZrcN` | `dev-build.yml` (`prerelease=true`) | **GitHub pre-release only** |
102
+ | `vX.Y.Z*` | release-please, or a hand-pushed tag | **PyPI + GHCR** (`release.yml`) |
103
+
104
+ `release.yml` triggers on `tags: v*`. A `v`-prefixed RC tag therefore uploads to
105
+ PyPI, which is irreversible; `dev-build.yml` refuses to create one for exactly
106
+ that reason. Outcome B below is what "publish a pre-release so we can install it
107
+ by version" means in this repo — **not** a `v` tag.
108
+
109
+ 1. `git checkout main && git pull --ff-only`.
110
+ 2. Determine the RC version `X.Y.ZrcN` (PEP 440 form, **no separator**):
111
+ - `X.Y.Z` is the next target version (feat → minor, fix → patch over the last
112
+ stable tag).
113
+ - `N` increments from the last RC for the same `X.Y.Z`. The tags are
114
+ `rc`-prefixed, so: `git tag --list "rc-X.Y.Zrc*"`, else `1`.
115
+ - Confirm the chosen version with the user.
116
+ 3. Ask which outcome they want, then follow only that one. **A** is the default;
117
+ **B** is what to reach for when someone wants to install the RC by version on
118
+ another machine.
119
+
120
+ ### A — Local validation only (nothing tagged, nothing published)
121
+
122
+ Bump `pyproject.toml` `[project].version` to `X.Y.ZrcN` and run `uv lock` so the
123
+ lockfile agrees (`tests/unit/test_lockfile_version.py` gates that pair). First
124
+ confirm neither file already carries edits — the revert below discards whatever
125
+ is in them, and a full test run separates the two moments:
126
+
127
+ ```bash
128
+ git diff --quiet -- pyproject.toml uv.lock \
129
+ || { echo "pyproject.toml/uv.lock already modified — STOP"; }
130
+ ```
131
+
132
+ Run the validation gate (**Step V**), then hand off `dist/*.whl` or the Tier 1
133
+ one-liner
134
+ (`uv tool install --force "git+https://github.com/get2knowio/remo.git@<branch>"`).
135
+
136
+ Then revert. Look before discarding — never `git restore` these paths blind:
137
+
138
+ ```bash
139
+ git diff -- pyproject.toml uv.lock # MUST show only the X.Y.ZrcN bump
140
+ git restore --source=HEAD --worktree -- pyproject.toml uv.lock
141
+ ```
142
+
143
+ If that diff contains anything else, stop and surface it: something edited these
144
+ files during the run, and discarding it destroys unrecoverable work.
145
+
146
+ ### B — GitHub pre-release, installable by version (no PyPI)
147
+
148
+ The usual way to get an RC onto other machines. `dev-build.yml` stamps the
149
+ version in CI, so **no local bump is needed** and nothing is committed. The
150
+ `prerelease` job attaches the *same* wheel the build job produced — it does not
151
+ rebuild — to a GitHub pre-release tagged `rc-X.Y.ZrcN`.
152
+
153
+ ```bash
154
+ gh workflow run dev-build.yml --ref main -f version=X.Y.ZrcN -f prerelease=true
155
+ # This also publishes ghcr.io/get2knowio/remo-web:X.Y.ZrcN (never `latest`) for
156
+ # Compose-based deployments — `image` defaults to true, so an RC is a complete
157
+ # artifact rather than a wheel with no image behind it. Add -f image=false for a
158
+ # CLI-only RC, which skips the emulated arm64 build.
159
+
160
+ # `gh run watch` needs an explicit run id outside a TTY. Give the dispatch a
161
+ # couple of seconds to register before listing.
162
+ RUN_ID="$(gh run list --workflow=dev-build.yml --limit 1 \
163
+ --json databaseId --jq '.[0].databaseId')"
164
+ gh run watch "$RUN_ID"
165
+ ```
166
+
167
+ Then **validate the published artifact**, which is stronger than a pre-build
168
+ local check because it is the wheel testers will actually fetch. Use a throwaway
169
+ venv so the operator's own install is untouched:
170
+
171
+ ```bash
172
+ URL="https://github.com/get2knowio/remo/releases/download/rc-X.Y.ZrcN/remo_cli-X.Y.ZrcN-py3-none-any.whl"
173
+ uv venv /tmp/remo-rc && uv pip install --python /tmp/remo-rc/bin/python "remo-cli @ $URL"
174
+ /tmp/remo-rc/bin/remo --version # MUST print X.Y.ZrcN
175
+ /tmp/remo-rc/bin/remo --help
176
+ ```
177
+
178
+ Confirm with `gh release view rc-X.Y.ZrcN` that it is marked pre-release, and
179
+ report that PyPI is unchanged. Testers install it with no `gh` auth:
180
+
181
+ ```bash
182
+ curl -fsSL https://raw.githubusercontent.com/get2knowio/remo/main/install.sh \
183
+ | bash -s -- --prerelease X.Y.ZrcN
184
+ # or directly:
185
+ uv tool install --force "remo-cli @ <URL above>"
186
+ ```
187
+
188
+ A GitHub pre-release is deletable and the version re-cuttable, so this outcome is
189
+ recoverable — unlike D.
190
+
191
+ ### C — Dev build artifact (no version reserved, no tag)
192
+
193
+ For cross-machine testing when no version should be claimed at all. Omit
194
+ `version` and the workflow stamps `X.Y.Z.devN+g<sha>`; that PEP 440 **local
195
+ segment** is what PyPI rejects outright, making publication structurally
196
+ impossible. Note this applies only to the auto version — an explicit
197
+ `-f version=X.Y.ZrcN` is stamped **verbatim with no local segment**, precisely so
198
+ it stays promotable.
199
+
200
+ ```bash
201
+ gh workflow run dev-build.yml # auto dev version
202
+ RUN_ID="$(gh run list --workflow=dev-build.yml --limit 1 \
203
+ --json databaseId --jq '.[0].databaseId')"
204
+ gh run watch "$RUN_ID"
205
+ gh run download "$RUN_ID" -n remo-wheel -D ./dl # needs gh auth on that machine
206
+ uv tool install --force ./dl/remo_cli-*.whl
207
+ ```
208
+
209
+ ### D — Publish the RC to PyPI (exceptional; explicit approval required)
210
+
211
+ Constitution IX permits this, but as **the exception**: "taken only when the
212
+ tester cannot install off-index." Outcome B needs no `gh` auth and no index, so
213
+ that condition is now rarely met — before proposing D, state why B will not work
214
+ for this tester. Never take D merely because the word "publish" was used.
215
+
216
+ Requires **Step V** on the bumped tree first (this is irreversible), then:
217
+
218
+ ```bash
219
+ git commit -am "chore(release): X.Y.ZrcN"
220
+ git tag vX.Y.ZrcN # a v* tag: this is what triggers release.yml
221
+ git push origin main vX.Y.ZrcN
222
+ ```
223
+
224
+ `release.yml` marks it a prerelease off the tag suffix, publishes to PyPI + GHCR,
225
+ and never moves `latest`. Offer to watch CI. Warn the operator that this reserves
226
+ `X.Y.ZrcN` on PyPI permanently.
227
+
228
+ ---
229
+
230
+ ## Step V — Validation gate (test the exact wheel before PyPI)
231
+
232
+ **Required for anything that reaches PyPI:** the stable lane, and RC outcome
233
+ **D**. Also used by RC outcome **A**, whose whole purpose it is.
234
+
235
+ Outcomes **B** and **C** build in clean CI rather than locally, so Step V does
236
+ not apply as written — their equivalent is the post-publish check in **B**, which
237
+ validates the artifact testers will actually fetch. If a full local run was
238
+ already green on the same commit, say so rather than repeating it; do not claim
239
+ Step V ran when CI did.
240
+
241
+ Run this on whatever ref will be released (the release-please PR head for stable,
242
+ or the bumped working tree for an RC). The published version comes from
243
+ `pyproject.toml` via `uv build`, so this builds the identical artifact:
244
+
245
+ ```bash
246
+ uv run pytest -q # full suite must pass
247
+ uv build # -> dist/remo_cli-<version>-py3-none-any.whl
248
+ VENV="$(mktemp -d)/venv"
249
+ uv venv "$VENV"
250
+ uv pip install --python "$VENV/bin/python" ./dist/remo_cli-<version>-py3-none-any.whl
251
+ "$VENV/bin/remo" --version # MUST equal <version>
252
+ "$VENV/bin/remo" --help # sanity-check the CLI loads
253
+ ```
254
+
255
+ Report the results. If tests fail, the wheel version doesn't match, or the CLI
256
+ doesn't load, **stop** and surface it — do not proceed to tag/merge/publish.
257
+
258
+ ## Done when
259
+
260
+ - The requested lane completed through the point the user approved (RC outcome
261
+ A/B/C/D, or stable PR merged).
262
+ - No tag was pushed, commit was pushed, or PR merged without explicit approval.
263
+ - The outcome was reported clearly, naming **which index was touched**: for
264
+ outcomes A–C, that PyPI is unchanged; for D or a stable release, the version
265
+ now permanently reserved there.
@@ -0,0 +1,99 @@
1
+ name: Publish the remo-web image
2
+ description: >
3
+ Build and push ghcr.io/<owner>/remo-web for one version, multi-arch
4
+ (linux/amd64 + linux/arm64). The single image-publishing path, shared by
5
+ release.yml (stable, from a v* tag) and rc-image.yml (pre-release, from an
6
+ rc-* tag).
7
+
8
+ # Why this exists: the five docker/* steps below were duplicated verbatim in
9
+ # release.yml and rc-image.yml, including their pinned SHAs. Dependabot proposes
10
+ # a bump per file, so PR #212 had to raise the same three pins in both — and a
11
+ # bump that landed in one file only would leave the two paths building with
12
+ # different tooling, with nothing to catch it. Same failure class as the
13
+ # codeql-action mismatch that tests/unit/test_workflow_action_pins.py was
14
+ # written for.
15
+ #
16
+ # What is deliberately NOT here: resolving the version, checking out a ref, and
17
+ # stamping pyproject.toml. Those differ by channel for real reasons — a stable
18
+ # version is already committed by release-please, whereas a pre-release version
19
+ # exists only as a workflow input — so each caller keeps its own.
20
+
21
+ inputs:
22
+ tag-spec:
23
+ description: >
24
+ The `tags:` value for docker/metadata-action. Callers pass their own
25
+ because the channels tag differently on purpose: stable gets
26
+ {{version}} + {{major}}.{{minor}} + conditionally `latest`, while a
27
+ pre-release gets its exact version and nothing else.
28
+ required: true
29
+ github-token:
30
+ description: >
31
+ Token for the GHCR login. Passed in because a composite action cannot
32
+ read `secrets.*` itself.
33
+ required: true
34
+ context:
35
+ description: >
36
+ Build context directory. Defaults to the workspace root, which is what
37
+ release.yml wants. rc-image.yml passes a subdirectory, because a local
38
+ `uses: ./…` action is read from the checked-out WORKING TREE — so that
39
+ workflow has to keep its own tree at the root (to find this action) and
40
+ check the target rc-* tag out beside it. Without that, backfilling an
41
+ image for a tag cut before this action existed would fail with "action
42
+ not found".
43
+ required: false
44
+ default: "."
45
+ dockerfile:
46
+ description: Path to the Dockerfile, relative to the workspace root.
47
+ required: false
48
+ default: docker/Dockerfile
49
+
50
+ outputs:
51
+ digest:
52
+ description: The pushed manifest's digest, for pinning by digest.
53
+ value: ${{ steps.build.outputs.digest }}
54
+ tags:
55
+ description: The fully-resolved tags that were pushed, newline-separated.
56
+ value: ${{ steps.meta.outputs.tags }}
57
+
58
+ runs:
59
+ using: composite
60
+ steps:
61
+ # Needed for the linux/arm64 half of the manifest: GitHub's runners are
62
+ # amd64, so arm64 is cross-built under emulation. This is what dominates
63
+ # the job's runtime, hence the 60-minute timeout at both call sites.
64
+ - uses: docker/setup-qemu-action@99012661954931238ded8c8b007157a8430204e1 # v4
65
+
66
+ - uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4
67
+
68
+ - name: Log in to GHCR
69
+ uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4
70
+ with:
71
+ registry: ghcr.io
72
+ username: ${{ github.actor }}
73
+ password: ${{ inputs.github-token }}
74
+
75
+ - name: Derive image tags and labels
76
+ id: meta
77
+ uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6
78
+ with:
79
+ images: ghcr.io/${{ github.repository_owner }}/remo-web
80
+ # Hardcoded, not an input: this disables the action's automatic `latest`
81
+ # for BOTH channels. Stable re-adds it through an explicit raw tag in its
82
+ # tag-spec; a pre-release has no way to reach `latest` at all, which is
83
+ # what makes publishing an RC image safe by default (dev-build.yml's
84
+ # `image` input). Making it configurable would make that reachable.
85
+ flavor: latest=false
86
+ tags: ${{ inputs.tag-spec }}
87
+
88
+ - name: Build and push (amd64 + arm64)
89
+ id: build
90
+ uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7
91
+ with:
92
+ context: ${{ inputs.context }}
93
+ file: ${{ inputs.dockerfile }}
94
+ platforms: linux/amd64,linux/arm64
95
+ push: true
96
+ tags: ${{ steps.meta.outputs.tags }}
97
+ # Includes org.opencontainers.image.source, which is what links the
98
+ # published GHCR package back to this repository.
99
+ labels: ${{ steps.meta.outputs.labels }}
@@ -0,0 +1,90 @@
1
+ version: 2
2
+ updates:
3
+ # Python dependencies (pyproject.toml + uv.lock)
4
+ #
5
+ # Must be "uv", not "pip": this repo resolves from the committed uv.lock, and
6
+ # the pip ecosystem does not update that file — it would bump pyproject.toml
7
+ # and leave the lock (the thing CI and the Docker build actually install
8
+ # from) untouched.
9
+ - package-ecosystem: "uv"
10
+ directory: "/"
11
+ schedule:
12
+ interval: "weekly"
13
+ day: "monday"
14
+ open-pull-requests-limit: 5
15
+ # Let a new release settle before we bump to it, so we don't chase
16
+ # immediately-yanked or regression releases.
17
+ cooldown:
18
+ default-days: 7
19
+ groups:
20
+ # One PR per week with all minor/patch production deps bumped together.
21
+ production-minor-patch:
22
+ dependency-type: "production"
23
+ update-types:
24
+ - "minor"
25
+ - "patch"
26
+ # One PR per week with all minor/patch dev-only deps bumped together.
27
+ dev-minor-patch:
28
+ dependency-type: "development"
29
+ update-types:
30
+ - "minor"
31
+ - "patch"
32
+ # Major bumps still get individual PRs so they can be reviewed carefully.
33
+
34
+ # GitHub Actions workflow versions
35
+ - package-ecosystem: "github-actions"
36
+ # "/" covers .github/workflows/ and a ROOT-level action.yml — and nothing
37
+ # else. Composite actions under .github/actions/** fall outside it whatever
38
+ # the directory value, so each needs its own entry or its pinned `uses:`
39
+ # SHAs are never bumped again. Moving the docker/* steps into
40
+ # publish-web-image without this would have silently frozen five pins,
41
+ # which is worse than the duplication it removed.
42
+ # tests/unit/test_dependabot_config.py::test_every_composite_action_is_covered
43
+ # fails if a new composite action is added without a line here.
44
+ directories:
45
+ - "/"
46
+ - "/.github/actions/publish-web-image"
47
+ schedule:
48
+ interval: "weekly"
49
+ day: "monday"
50
+ open-pull-requests-limit: 5
51
+ cooldown:
52
+ default-days: 7
53
+ groups:
54
+ actions:
55
+ update-types:
56
+ - "minor"
57
+ - "patch"
58
+
59
+ # Docker base images. Two Dockerfiles ship images:
60
+ # /Dockerfile — the CLI image (python:3.13-slim)
61
+ # /docker/Dockerfile — the remo-web service (node:24-slim, python:3.11-slim)
62
+ # Nothing watched these before, so a base image could sit on an unpatched
63
+ # tag indefinitely — the CVEs that matter for a container usually arrive via
64
+ # the base image, not via the app's own dependencies.
65
+ - package-ecosystem: "docker"
66
+ directories:
67
+ - "/"
68
+ - "/docker"
69
+ schedule:
70
+ interval: "weekly"
71
+ day: "monday"
72
+ open-pull-requests-limit: 5
73
+ cooldown:
74
+ default-days: 7
75
+ groups:
76
+ docker-images:
77
+ update-types:
78
+ - "minor"
79
+ - "patch"
80
+ ignore:
81
+ # Dependabot picks the highest published tag and has no concept of
82
+ # Node's release lines. Left alone it proposed node:20-slim ->
83
+ # node:25-slim (#156): 25 is an odd-numbered "Current" release that
84
+ # never becomes LTS and went EOL on 2026-06-01, so that bump would have
85
+ # swapped one unpatched base image for another — the exact failure this
86
+ # ecosystem entry exists to prevent. Node majors are picked by hand
87
+ # instead, on the LTS cadence (even-numbered, each October). Minor and
88
+ # patch bumps, which carry the base-image CVE fixes, keep flowing.
89
+ - dependency-name: "node"
90
+ update-types: ["version-update:semver-major"]
@@ -0,0 +1,197 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [main]
6
+ push:
7
+ branches: [main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ concurrency:
13
+ group: ci-${{ github.ref }}
14
+ cancel-in-progress: true # Superseded by a newer commit on the same ref — nothing external is touched.
15
+
16
+ jobs:
17
+ test:
18
+ name: Tests (Python ${{ matrix.python-version }})
19
+ runs-on: ubuntu-latest
20
+ strategy:
21
+ matrix:
22
+ python-version: ["3.11", "3.12", "3.13"]
23
+
24
+ steps:
25
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
26
+
27
+ - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
28
+
29
+ - name: Set up Python ${{ matrix.python-version }}
30
+ run: uv python install ${{ matrix.python-version }}
31
+
32
+ - name: Install dependencies
33
+ run: uv sync --all-extras --python ${{ matrix.python-version }}
34
+
35
+ - name: Run tests
36
+ run: uv run --python ${{ matrix.python-version }} pytest --tb=short -q
37
+
38
+ docker-image:
39
+ name: Docker image (amd64 + arm64)
40
+ runs-on: ubuntu-latest
41
+ # This job is the only thing that actually builds docker/Dockerfile. The
42
+ # tests/image/ checks that run in the `test` job above are structural --
43
+ # they grep the Dockerfile for the right strings -- so without this a
44
+ # genuinely broken image (failed npm ci, moved asset path, bad arch
45
+ # branch) ships green. Multi-minute by nature: an emulated arm64 build
46
+ # runs npm ci and pip install under QEMU.
47
+ timeout-minutes: 45
48
+ steps:
49
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
50
+
51
+ # Registers binfmt handlers so the arm64 half of tests/image/ can build
52
+ # under emulation on an amd64 runner. The arch-selection branch
53
+ # (FR-027/FR-042) has no other way to be exercised here.
54
+ - uses: docker/setup-qemu-action@99012661954931238ded8c8b007157a8430204e1 # v4
55
+
56
+ - uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4
57
+
58
+ - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
59
+
60
+ - name: Install dependencies
61
+ run: uv sync --all-extras
62
+
63
+ # REMO_RUN_IMAGE_TESTS=1 opts into tier 2 of tests/image/: real
64
+ # `docker buildx build` for amd64 + arm64, then runs the built image
65
+ # under compose.example.yml's hardening flags and asserts non-root UID,
66
+ # a genuinely read-only rootfs, an arch-correct session-manager-plugin,
67
+ # and that /api/v1/ready gates on missing mounts. The tests skip
68
+ # honestly (not fail) if emulation turns out to be unusable.
69
+ - name: Build and verify the remo-web image
70
+ env:
71
+ REMO_RUN_IMAGE_TESTS: "1"
72
+ run: uv run pytest tests/image/ -v --tb=short
73
+
74
+ wheel-install:
75
+ name: Wheel install smoke test
76
+ runs-on: ubuntu-latest
77
+ steps:
78
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
79
+
80
+ - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
81
+
82
+ - name: Build wheel
83
+ run: uv build --wheel
84
+
85
+ - name: Install wheel into a fresh venv (non-editable)
86
+ run: |
87
+ uv venv /tmp/remo-wheel-test
88
+ uv pip install --python /tmp/remo-wheel-test/bin/python dist/*.whl
89
+
90
+ - name: Verify ansible dir is found and contains playbooks
91
+ run: |
92
+ /tmp/remo-wheel-test/bin/python - <<'EOF'
93
+ from remo_cli.core.config import get_ansible_dir
94
+ d = get_ansible_dir()
95
+ print(f"ansible_dir: {d}")
96
+ assert (d / "incus_configure.yml").is_file(), f"incus_configure.yml not found in {d}"
97
+ assert (d / "requirements.yml").is_file(), f"requirements.yml not found in {d}"
98
+ assert not (d / "__init__.py").exists(), f"ansible_dir looks like a Python package: {d}"
99
+ print("OK: ansible playbooks found in installed wheel")
100
+ EOF
101
+
102
+ fish-completion:
103
+ name: Fish completion (real shell)
104
+ runs-on: ubuntu-latest
105
+ steps:
106
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
107
+
108
+ - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
109
+
110
+ - name: Install fish
111
+ run: |
112
+ sudo apt-get update -qq
113
+ sudo apt-get install -y -qq fish
114
+
115
+ # The activation script shells out to `remo` by name, so it has to be a
116
+ # real binary on PATH — `uv run remo` would never be found by fish.
117
+ - name: Install remo onto PATH
118
+ run: |
119
+ uv sync
120
+ echo "$PWD/.venv/bin" >> "$GITHUB_PATH"
121
+
122
+ # Asserting on the text of the generated script is not enough: the bug
123
+ # this guards against (a2542e9) produced a script that read fine and
124
+ # emitted a screenful of errors the moment fish executed it.
125
+ - name: Run completions in a real fish shell
126
+ run: ./tests/integration/fish_completion.sh
127
+
128
+ lint:
129
+ name: Lint & Types
130
+ runs-on: ubuntu-latest
131
+ steps:
132
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
133
+
134
+ - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
135
+
136
+ - name: Install dependencies
137
+ run: uv sync --all-extras
138
+
139
+ - name: Ruff check
140
+ run: uv run ruff check src/remo_cli
141
+
142
+ # mypy analyses against python_version = "3.11" from [tool.mypy], so the
143
+ # result is independent of whichever interpreter uv resolves here. The
144
+ # `web` extra must be installed (it is, via --all-extras) or every
145
+ # src/remo_cli/web/ module degrades to Any and the gate goes blind.
146
+ - name: Mypy check
147
+ run: uv run mypy src/remo_cli
148
+
149
+ frontend:
150
+ name: Frontend (typecheck + unit + build)
151
+ runs-on: ubuntu-latest
152
+ # Fast, backend-free coverage of the SPA: tsc typecheck, the Vitest
153
+ # unit/component suite (frontend/src/**/*.test.ts), the browser geometry
154
+ # suite (frontend/tests/geometry), and a production build.
155
+ #
156
+ # The geometry suite runs here because it is self-contained: it serves a
157
+ # fixture page with Vite and answers the terminal API/WebSocket from inside
158
+ # the spec. It covers what jsdom structurally cannot — jsdom has no layout
159
+ # engine, so every element measures 0x0 and any assertion about the terminal
160
+ # grid fitting its box passes vacuously there.
161
+ #
162
+ # The Playwright e2e suite (frontend/tests/e2e) is still NOT run here — it needs
163
+ # a live `remo web serve` backend (REMO_E2E_BASE_URL); see playwright.config.ts.
164
+ defaults:
165
+ run:
166
+ working-directory: frontend
167
+ steps:
168
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
169
+
170
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
171
+ with:
172
+ node-version: "24"
173
+ cache: npm
174
+ cache-dependency-path: frontend/package-lock.json
175
+
176
+ - name: Install dependencies
177
+ run: npm ci
178
+
179
+ - name: Typecheck
180
+ run: npm run lint
181
+
182
+ - name: Check generated types are fresh
183
+ run: npm run check:types-fresh
184
+
185
+ - name: Unit tests
186
+ run: npm run test
187
+
188
+ # Chromium only — the geometry suite runs the same specs twice against it
189
+ # (WebGL and DOM renderers) and needs no other browser.
190
+ - name: Install Chromium for the geometry suite
191
+ run: npx playwright install --with-deps chromium
192
+
193
+ - name: Browser geometry tests
194
+ run: npm run test:geometry
195
+
196
+ - name: Build
197
+ run: npm run build