remo-cli 4.3.5__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.
- remo_cli-4.4.0/.claude/skills/release/SKILL.md +265 -0
- remo_cli-4.4.0/.github/actions/publish-web-image/action.yml +99 -0
- remo_cli-4.4.0/.github/dependabot.yml +90 -0
- remo_cli-4.4.0/.github/workflows/ci.yml +197 -0
- remo_cli-4.4.0/.github/workflows/codeql.yml +49 -0
- remo_cli-4.4.0/.github/workflows/dependency-review.yml +22 -0
- remo_cli-4.4.0/.github/workflows/dev-build.yml +216 -0
- remo_cli-4.4.0/.github/workflows/provision.yml +50 -0
- remo_cli-4.4.0/.github/workflows/rc-image.yml +140 -0
- remo_cli-4.4.0/.github/workflows/release-please.yml +108 -0
- remo_cli-4.4.0/.github/workflows/release.yml +229 -0
- remo_cli-4.4.0/.github/workflows/smoke-test-cleanup.yml +125 -0
- remo_cli-4.4.0/.github/workflows/smoke-test.yml +887 -0
- remo_cli-4.4.0/.github/workflows/teardown.yml +41 -0
- remo_cli-4.4.0/.release-please-manifest.json +3 -0
- remo_cli-4.4.0/.specify/feature.json +3 -0
- remo_cli-4.4.0/.specify/memory/constitution.md +600 -0
- remo_cli-4.4.0/.specify/templates/plan-template.md +126 -0
- remo_cli-4.4.0/AGENTS.md +466 -0
- remo_cli-4.4.0/CHANGELOG.md +190 -0
- remo_cli-4.4.0/CLAUDE.md +463 -0
- remo_cli-4.4.0/CONTRIBUTING.md +286 -0
- remo_cli-4.4.0/Dockerfile +71 -0
- remo_cli-4.4.0/PKG-INFO +810 -0
- remo_cli-4.4.0/README.md +775 -0
- remo_cli-4.4.0/ansible/README.md +151 -0
- remo_cli-4.4.0/ansible/roles/deacon/defaults/main.yml +11 -0
- remo_cli-4.4.0/ansible/roles/nested_docker/tasks/main.yml +262 -0
- remo_cli-4.4.0/ansible/roles/ssm_connector/defaults/main.yml +22 -0
- remo_cli-4.4.0/ansible/roles/ssm_connector/handlers/main.yml +5 -0
- remo_cli-4.4.0/ansible/roles/ssm_connector/tasks/main.yml +237 -0
- remo_cli-4.4.0/ansible/roles/ssm_connector/tasks/scan_and_trust_host_key.yml +93 -0
- remo_cli-4.4.0/ansible/roles/user_setup/defaults/main.yml +41 -0
- remo_cli-4.4.0/ansible/roles/user_setup/templates/remo-host.sh.j2 +940 -0
- remo_cli-4.4.0/ansible/ssm_connector_enroll.yml +113 -0
- remo_cli-4.4.0/ansible/ssm_connector_unenroll.yml +94 -0
- remo_cli-4.4.0/ansible/tasks/configure_dev_tools.yml +146 -0
- remo_cli-4.4.0/ansible/tasks/resolve_devcontainer_runtime.yml +79 -0
- remo_cli-4.4.0/docker/Dockerfile +156 -0
- remo_cli-4.4.0/docker/entrypoint.sh +108 -0
- remo_cli-4.4.0/docs/aws.md +411 -0
- remo_cli-4.4.0/docs/feature-history.md +27 -0
- remo_cli-4.4.0/docs/nested-overlayfs.md +224 -0
- remo_cli-4.4.0/docs/provider-plugins.md +130 -0
- remo_cli-4.4.0/docs/providers.md +355 -0
- remo_cli-4.4.0/docs/proxmox.md +393 -0
- remo_cli-4.4.0/docs/ssm-connector.md +250 -0
- remo_cli-4.4.0/docs/web-session-interface.md +1247 -0
- remo_cli-4.4.0/frontend/src/api/client.test.ts +329 -0
- remo_cli-4.4.0/frontend/src/api/client.ts +666 -0
- remo_cli-4.4.0/frontend/src/api/generated/openapi.json +3190 -0
- remo_cli-4.4.0/frontend/src/api/generated/schema.d.ts +2761 -0
- remo_cli-4.4.0/frontend/src/components/AddHostPage.css +89 -0
- remo_cli-4.4.0/frontend/src/components/AddHostPage.test.tsx +218 -0
- remo_cli-4.4.0/frontend/src/components/AddHostPage.tsx +449 -0
- remo_cli-4.4.0/frontend/src/components/AppShell.tsx +361 -0
- remo_cli-4.4.0/frontend/src/components/ConfigureConfirmDialog.tsx +47 -0
- remo_cli-4.4.0/frontend/src/components/DeleteProjectDialog.test.tsx +60 -0
- remo_cli-4.4.0/frontend/src/components/DeleteProjectDialog.tsx +58 -0
- remo_cli-4.4.0/frontend/src/components/DiagnosticsSection.css +35 -0
- remo_cli-4.4.0/frontend/src/components/DiagnosticsSection.test.tsx +79 -0
- remo_cli-4.4.0/frontend/src/components/DiagnosticsSection.tsx +70 -0
- remo_cli-4.4.0/frontend/src/components/HostDetailPage.css +546 -0
- remo_cli-4.4.0/frontend/src/components/HostDetailPage.test.tsx +368 -0
- remo_cli-4.4.0/frontend/src/components/HostDetailPage.tsx +695 -0
- remo_cli-4.4.0/frontend/src/components/HostShellPanel.tsx +125 -0
- remo_cli-4.4.0/frontend/src/components/JobProgressPanel.test.tsx +191 -0
- remo_cli-4.4.0/frontend/src/components/JobProgressPanel.tsx +154 -0
- remo_cli-4.4.0/frontend/src/components/PairToSync.tsx +139 -0
- remo_cli-4.4.0/frontend/src/components/RebuildConfirmDialog.test.tsx +85 -0
- remo_cli-4.4.0/frontend/src/components/RebuildConfirmDialog.tsx +75 -0
- remo_cli-4.4.0/frontend/src/components/RemoveHostDialog.tsx +51 -0
- remo_cli-4.4.0/frontend/src/components/SessionRail.css +563 -0
- remo_cli-4.4.0/frontend/src/components/SessionRail.test.tsx +214 -0
- remo_cli-4.4.0/frontend/src/components/SessionRail.tsx +616 -0
- remo_cli-4.4.0/frontend/src/components/SettingsPage.css +363 -0
- remo_cli-4.4.0/frontend/src/components/SettingsPage.tsx +428 -0
- remo_cli-4.4.0/frontend/src/components/TerminalCard.css +426 -0
- remo_cli-4.4.0/frontend/src/components/TerminalCard.test.tsx +431 -0
- remo_cli-4.4.0/frontend/src/components/TerminalCard.tsx +958 -0
- remo_cli-4.4.0/frontend/src/components/TypeToConfirmDialog.tsx +80 -0
- remo_cli-4.4.0/frontend/src/components/WorkspacePane.test.tsx +370 -0
- remo_cli-4.4.0/frontend/src/components/WorkspacePane.tsx +381 -0
- remo_cli-4.4.0/frontend/src/components/railModel.test.ts +390 -0
- remo_cli-4.4.0/frontend/src/components/railModel.ts +240 -0
- remo_cli-4.4.0/frontend/src/lib/breakpoints.ts +12 -0
- remo_cli-4.4.0/frontend/src/main.tsx +35 -0
- remo_cli-4.4.0/frontend/src/state/diagnostics.test.ts +233 -0
- remo_cli-4.4.0/frontend/src/state/diagnostics.ts +218 -0
- remo_cli-4.4.0/frontend/src/state/health.test.ts +114 -0
- remo_cli-4.4.0/frontend/src/state/health.ts +192 -0
- remo_cli-4.4.0/frontend/src/state/hostStats.test.ts +139 -0
- remo_cli-4.4.0/frontend/src/state/hostStats.ts +105 -0
- remo_cli-4.4.0/frontend/src/state/latency.ts +75 -0
- remo_cli-4.4.0/frontend/src/state/settings.test.ts +446 -0
- remo_cli-4.4.0/frontend/src/state/settings.ts +523 -0
- remo_cli-4.4.0/frontend/src/state/workspace.ts +457 -0
- remo_cli-4.4.0/frontend/src/terminal/RendererAdapter.ts +194 -0
- remo_cli-4.4.0/frontend/src/terminal/TerminalConnection.test.ts +442 -0
- remo_cli-4.4.0/frontend/src/terminal/TerminalConnection.ts +540 -0
- remo_cli-4.4.0/frontend/src/terminal/XtermRenderer.test.ts +73 -0
- remo_cli-4.4.0/frontend/src/terminal/XtermRenderer.ts +323 -0
- remo_cli-4.4.0/frontend/src/terminal/fitLoop.test.ts +147 -0
- remo_cli-4.4.0/frontend/src/terminal/fitLoop.ts +101 -0
- remo_cli-4.4.0/frontend/tests/e2e/host-detail.spec.ts +44 -0
- remo_cli-4.4.0/frontend/tests/e2e/registry-admin.spec.ts +28 -0
- remo_cli-4.4.0/install.sh +454 -0
- remo_cli-4.4.0/pyproject.toml +118 -0
- remo_cli-4.4.0/specs/010-web-session-interface/contracts/remo-host-protocol.md +238 -0
- remo_cli-4.4.0/specs/023-web-registry-sync/contracts/cli-web-sync.md +79 -0
- remo_cli-4.4.0/specs/023-web-registry-sync/contracts/mirror-meta.md +24 -0
- remo_cli-4.4.0/specs/023-web-registry-sync/contracts/mirror-payload-v3.md +33 -0
- remo_cli-4.4.0/specs/023-web-registry-sync/contracts/push-cache-v4.md +25 -0
- remo_cli-4.4.0/specs/023-web-registry-sync/contracts/registry-admin-api.md +25 -0
- remo_cli-4.4.0/specs/023-web-registry-sync/contracts/setup-registry-get.md +40 -0
- remo_cli-4.4.0/specs/024-discovery-resilience/checklists/requirements.md +38 -0
- remo_cli-4.4.0/specs/024-discovery-resilience/contracts/instance-out-stale.md +59 -0
- remo_cli-4.4.0/specs/024-discovery-resilience/data-model.md +100 -0
- remo_cli-4.4.0/specs/024-discovery-resilience/plan.md +192 -0
- remo_cli-4.4.0/specs/024-discovery-resilience/quickstart.md +55 -0
- remo_cli-4.4.0/specs/024-discovery-resilience/research.md +209 -0
- remo_cli-4.4.0/specs/024-discovery-resilience/spec.md +357 -0
- remo_cli-4.4.0/specs/024-discovery-resilience/tasks.md +93 -0
- remo_cli-4.4.0/specs/025-ssm-connector/checklists/requirements.md +43 -0
- remo_cli-4.4.0/specs/025-ssm-connector/contracts/ansible-role.md +71 -0
- remo_cli-4.4.0/specs/025-ssm-connector/contracts/cli.md +79 -0
- remo_cli-4.4.0/specs/025-ssm-connector/contracts/session-document.md +75 -0
- remo_cli-4.4.0/specs/025-ssm-connector/data-model.md +93 -0
- remo_cli-4.4.0/specs/025-ssm-connector/issues.md +125 -0
- remo_cli-4.4.0/specs/025-ssm-connector/plan.md +127 -0
- remo_cli-4.4.0/specs/025-ssm-connector/quickstart.md +81 -0
- remo_cli-4.4.0/specs/025-ssm-connector/research.md +185 -0
- remo_cli-4.4.0/specs/025-ssm-connector/spec.md +557 -0
- remo_cli-4.4.0/specs/025-ssm-connector/tasks.md +176 -0
- remo_cli-4.4.0/specs/026-deacon-default-runtime/checklists/requirements.md +38 -0
- remo_cli-4.4.0/specs/026-deacon-default-runtime/contracts/remo-host-capabilities.md +19 -0
- remo_cli-4.4.0/specs/026-deacon-default-runtime/contracts/runtime-resolution.md +21 -0
- remo_cli-4.4.0/specs/026-deacon-default-runtime/data-model.md +30 -0
- remo_cli-4.4.0/specs/026-deacon-default-runtime/issues.md +23 -0
- remo_cli-4.4.0/specs/026-deacon-default-runtime/plan.md +91 -0
- remo_cli-4.4.0/specs/026-deacon-default-runtime/quickstart.md +26 -0
- remo_cli-4.4.0/specs/026-deacon-default-runtime/research.md +69 -0
- remo_cli-4.4.0/specs/026-deacon-default-runtime/spec.md +365 -0
- remo_cli-4.4.0/specs/026-deacon-default-runtime/tasks.md +56 -0
- remo_cli-4.4.0/specs/027-provider-plugins/checklists/requirements.md +31 -0
- remo_cli-4.4.0/specs/027-provider-plugins/contracts/plugin-contract.md +25 -0
- remo_cli-4.4.0/specs/027-provider-plugins/data-model.md +23 -0
- remo_cli-4.4.0/specs/027-provider-plugins/issues.md +17 -0
- remo_cli-4.4.0/specs/027-provider-plugins/plan.md +62 -0
- remo_cli-4.4.0/specs/027-provider-plugins/quickstart.md +12 -0
- remo_cli-4.4.0/specs/027-provider-plugins/research.md +43 -0
- remo_cli-4.4.0/specs/027-provider-plugins/spec.md +182 -0
- remo_cli-4.4.0/specs/027-provider-plugins/tasks.md +41 -0
- remo_cli-4.4.0/src/remo_cli/cli/connector.py +145 -0
- remo_cli-4.4.0/src/remo_cli/cli/main.py +330 -0
- remo_cli-4.4.0/src/remo_cli/cli/plugins.py +51 -0
- remo_cli-4.4.0/src/remo_cli/cli/web.py +546 -0
- remo_cli-4.4.0/src/remo_cli/core/attach.py +66 -0
- remo_cli-4.4.0/src/remo_cli/core/config.py +209 -0
- remo_cli-4.4.0/src/remo_cli/core/connector.py +407 -0
- remo_cli-4.4.0/src/remo_cli/core/known_hosts.py +322 -0
- remo_cli-4.4.0/src/remo_cli/core/platform.py +49 -0
- remo_cli-4.4.0/src/remo_cli/core/provider_plugins.py +180 -0
- remo_cli-4.4.0/src/remo_cli/core/provider_registry.py +417 -0
- remo_cli-4.4.0/src/remo_cli/core/reconcile.py +520 -0
- remo_cli-4.4.0/src/remo_cli/core/registry.py +922 -0
- remo_cli-4.4.0/src/remo_cli/core/remo_attach_document.json +19 -0
- remo_cli-4.4.0/src/remo_cli/core/remo_host_client.py +780 -0
- remo_cli-4.4.0/src/remo_cli/core/ssh.py +656 -0
- remo_cli-4.4.0/src/remo_cli/core/validation.py +167 -0
- remo_cli-4.4.0/src/remo_cli/core/web_adopt.py +2134 -0
- remo_cli-4.4.0/src/remo_cli/core/web_drift.py +204 -0
- remo_cli-4.4.0/src/remo_cli/core/web_sync.py +1181 -0
- remo_cli-4.4.0/src/remo_cli/models/discovery.py +72 -0
- remo_cli-4.4.0/src/remo_cli/models/host.py +165 -0
- remo_cli-4.4.0/src/remo_cli/models/host_job.py +101 -0
- remo_cli-4.4.0/src/remo_cli/models/host_stats.py +171 -0
- remo_cli-4.4.0/src/remo_cli/providers/added.py +508 -0
- remo_cli-4.4.0/src/remo_cli/providers/aws_descriptor.py +102 -0
- remo_cli-4.4.0/src/remo_cli/providers/builtin.py +26 -0
- remo_cli-4.4.0/src/remo_cli/providers/connector.py +566 -0
- remo_cli-4.4.0/src/remo_cli/providers/incus_descriptor.py +119 -0
- remo_cli-4.4.0/src/remo_cli/providers/proxmox_descriptor.py +149 -0
- remo_cli-4.4.0/src/remo_cli/web/api/gating.py +61 -0
- remo_cli-4.4.0/src/remo_cli/web/api/host_admin.py +274 -0
- remo_cli-4.4.0/src/remo_cli/web/api/hosts.py +567 -0
- remo_cli-4.4.0/src/remo_cli/web/api/registry_admin.py +794 -0
- remo_cli-4.4.0/src/remo_cli/web/api/setup.py +727 -0
- remo_cli-4.4.0/src/remo_cli/web/api/terminals.py +585 -0
- remo_cli-4.4.0/src/remo_cli/web/app.py +291 -0
- remo_cli-4.4.0/src/remo_cli/web/check.py +453 -0
- remo_cli-4.4.0/src/remo_cli/web/config.py +341 -0
- remo_cli-4.4.0/src/remo_cli/web/discovery.py +653 -0
- remo_cli-4.4.0/src/remo_cli/web/health.py +349 -0
- remo_cli-4.4.0/src/remo_cli/web/jobs.py +361 -0
- remo_cli-4.4.0/src/remo_cli/web/mirror_meta.py +108 -0
- remo_cli-4.4.0/src/remo_cli/web/models.py +101 -0
- remo_cli-4.4.0/src/remo_cli/web/terminal.py +603 -0
- remo_cli-4.4.0/src/remo_cli/web/terminal_registry.py +229 -0
- remo_cli-4.4.0/src/remo_cli/web/trust_store.py +133 -0
- remo_cli-4.4.0/tests/ansible/test_deacon_role.py +86 -0
- remo_cli-4.4.0/tests/ansible/test_devcontainer_runtime_resolution.py +225 -0
- remo_cli-4.4.0/tests/ansible/test_ssm_connector_role.py +405 -0
- remo_cli-4.4.0/tests/fixtures/remo_fixture_provider/pyproject.toml +18 -0
- remo_cli-4.4.0/tests/fixtures/remo_fixture_provider/src/remo_fixture_provider/__init__.py +1 -0
- remo_cli-4.4.0/tests/fixtures/remo_fixture_provider/src/remo_fixture_provider/descriptor.py +36 -0
- remo_cli-4.4.0/tests/fixtures/remo_fixture_provider/src/remo_fixture_provider/provider.py +99 -0
- remo_cli-4.4.0/tests/integration/test_fixture_plugin_e2e.py +83 -0
- remo_cli-4.4.0/tests/integration/test_setup_payload_versions.py +279 -0
- remo_cli-4.4.0/tests/integration/test_web_adopt_e2e.py +733 -0
- remo_cli-4.4.0/tests/integration/test_web_sync_e2e.py +188 -0
- remo_cli-4.4.0/tests/unit/cli/test_connector_cmd.py +46 -0
- remo_cli-4.4.0/tests/unit/cli/test_connector_lazy_import.py +135 -0
- remo_cli-4.4.0/tests/unit/cli/test_main.py +309 -0
- remo_cli-4.4.0/tests/unit/cli/test_platform_gate.py +93 -0
- remo_cli-4.4.0/tests/unit/cli/test_providers_cmd.py +56 -0
- remo_cli-4.4.0/tests/unit/core/test_attach_builder.py +159 -0
- remo_cli-4.4.0/tests/unit/core/test_connector_document.py +61 -0
- remo_cli-4.4.0/tests/unit/core/test_connector_exposure.py +75 -0
- remo_cli-4.4.0/tests/unit/core/test_connector_target.py +200 -0
- remo_cli-4.4.0/tests/unit/core/test_platform.py +50 -0
- remo_cli-4.4.0/tests/unit/core/test_provider_plugins.py +386 -0
- remo_cli-4.4.0/tests/unit/core/test_provider_registry.py +240 -0
- remo_cli-4.4.0/tests/unit/core/test_registry_plugin_types.py +168 -0
- remo_cli-4.4.0/tests/unit/core/test_remo_host_client.py +1311 -0
- remo_cli-4.4.0/tests/unit/core/test_ssh_identity_opts.py +488 -0
- remo_cli-4.4.0/tests/unit/core/test_validation.py +394 -0
- remo_cli-4.4.0/tests/unit/core/test_web_drift.py +187 -0
- remo_cli-4.4.0/tests/unit/core/test_web_push.py +839 -0
- remo_cli-4.4.0/tests/unit/core/test_web_sync.py +772 -0
- remo_cli-4.4.0/tests/unit/providers/test_added_configure.py +270 -0
- remo_cli-4.4.0/tests/unit/providers/test_connector_attach.py +315 -0
- remo_cli-4.4.0/tests/unit/providers/test_connector_enroll.py +457 -0
- remo_cli-4.4.0/tests/unit/providers/test_proxmox_devcontainer_runtime.py +97 -0
- remo_cli-4.4.0/tests/unit/test_ansible_templates.py +1206 -0
- remo_cli-4.4.0/tests/unit/test_architecture_provider_literals.py +51 -0
- remo_cli-4.4.0/tests/unit/test_dependabot_config.py +141 -0
- remo_cli-4.4.0/tests/unit/test_dev_build_workflow.py +103 -0
- remo_cli-4.4.0/tests/unit/test_docs_runtime_claims.py +49 -0
- remo_cli-4.4.0/tests/unit/test_install_script.py +371 -0
- remo_cli-4.4.0/tests/unit/test_release_prerelease_detection.py +207 -0
- remo_cli-4.4.0/tests/unit/test_schema_drift.py +891 -0
- remo_cli-4.4.0/tests/unit/test_web_image_action.py +155 -0
- remo_cli-4.4.0/tests/unit/web/fixtures/hosts_response.json +1 -0
- remo_cli-4.4.0/tests/unit/web/test_check_plugins.py +55 -0
- remo_cli-4.4.0/tests/unit/web/test_cli_jobs.py +179 -0
- remo_cli-4.4.0/tests/unit/web/test_config.py +47 -0
- remo_cli-4.4.0/tests/unit/web/test_discovery.py +920 -0
- remo_cli-4.4.0/tests/unit/web/test_health_states.py +345 -0
- remo_cli-4.4.0/tests/unit/web/test_host_admin_api.py +485 -0
- remo_cli-4.4.0/tests/unit/web/test_hosts_mapping.py +154 -0
- remo_cli-4.4.0/tests/unit/web/test_mirror_meta.py +92 -0
- remo_cli-4.4.0/tests/unit/web/test_payload_equivalence.py +129 -0
- remo_cli-4.4.0/tests/unit/web/test_registry_admin_api.py +621 -0
- remo_cli-4.4.0/tests/unit/web/test_setup_api.py +905 -0
- remo_cli-4.4.0/tests/unit/web/test_setup_dormancy.py +153 -0
- remo_cli-4.4.0/tests/unit/web/test_terminals_api.py +538 -0
- remo_cli-4.4.0/tests/unit/web/test_trust_store.py +90 -0
- remo_cli-4.4.0/uv.lock +1494 -0
- remo_cli-4.3.5/.claude/skills/release/SKILL.md +0 -173
- remo_cli-4.3.5/.github/dependabot.yml +0 -75
- remo_cli-4.3.5/.github/workflows/ci.yml +0 -190
- remo_cli-4.3.5/.github/workflows/codeql.yml +0 -45
- remo_cli-4.3.5/.github/workflows/dependency-review.yml +0 -18
- remo_cli-4.3.5/.github/workflows/dev-build.yml +0 -78
- remo_cli-4.3.5/.github/workflows/provision.yml +0 -43
- remo_cli-4.3.5/.github/workflows/release-please.yml +0 -104
- remo_cli-4.3.5/.github/workflows/release.yml +0 -219
- remo_cli-4.3.5/.github/workflows/smoke-test-cleanup.yml +0 -113
- remo_cli-4.3.5/.github/workflows/smoke-test.yml +0 -884
- remo_cli-4.3.5/.github/workflows/teardown.yml +0 -34
- remo_cli-4.3.5/.release-please-manifest.json +0 -3
- remo_cli-4.3.5/.specify/feature.json +0 -3
- remo_cli-4.3.5/.specify/memory/constitution.md +0 -461
- remo_cli-4.3.5/.specify/templates/plan-template.md +0 -125
- remo_cli-4.3.5/AGENTS.md +0 -349
- remo_cli-4.3.5/CHANGELOG.md +0 -159
- remo_cli-4.3.5/CLAUDE.md +0 -346
- remo_cli-4.3.5/CONTRIBUTING.md +0 -223
- remo_cli-4.3.5/Dockerfile +0 -71
- remo_cli-4.3.5/PKG-INFO +0 -656
- remo_cli-4.3.5/README.md +0 -630
- remo_cli-4.3.5/ansible/README.md +0 -150
- remo_cli-4.3.5/ansible/roles/deacon/defaults/main.yml +0 -7
- remo_cli-4.3.5/ansible/roles/nested_docker/tasks/main.yml +0 -260
- remo_cli-4.3.5/ansible/roles/user_setup/defaults/main.yml +0 -35
- remo_cli-4.3.5/ansible/roles/user_setup/templates/remo-host.sh.j2 +0 -299
- remo_cli-4.3.5/ansible/tasks/configure_dev_tools.yml +0 -111
- remo_cli-4.3.5/docker/Dockerfile +0 -142
- remo_cli-4.3.5/docker/entrypoint.sh +0 -88
- remo_cli-4.3.5/docs/aws.md +0 -406
- remo_cli-4.3.5/docs/feature-history.md +0 -22
- remo_cli-4.3.5/docs/nested-overlayfs.md +0 -201
- remo_cli-4.3.5/docs/providers.md +0 -349
- remo_cli-4.3.5/docs/proxmox.md +0 -372
- remo_cli-4.3.5/docs/web-session-interface.md +0 -982
- remo_cli-4.3.5/frontend/src/api/client.test.ts +0 -182
- remo_cli-4.3.5/frontend/src/api/client.ts +0 -452
- remo_cli-4.3.5/frontend/src/api/generated/openapi.json +0 -1205
- remo_cli-4.3.5/frontend/src/api/generated/schema.d.ts +0 -1067
- remo_cli-4.3.5/frontend/src/components/AppShell.tsx +0 -303
- remo_cli-4.3.5/frontend/src/components/PairToSync.tsx +0 -139
- remo_cli-4.3.5/frontend/src/components/SessionRail.css +0 -392
- remo_cli-4.3.5/frontend/src/components/SessionRail.tsx +0 -358
- remo_cli-4.3.5/frontend/src/components/SettingsPage.css +0 -347
- remo_cli-4.3.5/frontend/src/components/SettingsPage.tsx +0 -408
- remo_cli-4.3.5/frontend/src/components/TerminalCard.css +0 -407
- remo_cli-4.3.5/frontend/src/components/TerminalCard.test.tsx +0 -333
- remo_cli-4.3.5/frontend/src/components/TerminalCard.tsx +0 -905
- remo_cli-4.3.5/frontend/src/components/WorkspacePane.test.tsx +0 -274
- remo_cli-4.3.5/frontend/src/components/WorkspacePane.tsx +0 -335
- remo_cli-4.3.5/frontend/src/components/railModel.test.ts +0 -121
- remo_cli-4.3.5/frontend/src/components/railModel.ts +0 -152
- remo_cli-4.3.5/frontend/src/main.tsx +0 -30
- remo_cli-4.3.5/frontend/src/state/health.test.ts +0 -77
- remo_cli-4.3.5/frontend/src/state/health.ts +0 -139
- remo_cli-4.3.5/frontend/src/state/latency.ts +0 -69
- remo_cli-4.3.5/frontend/src/state/settings.test.ts +0 -319
- remo_cli-4.3.5/frontend/src/state/settings.ts +0 -429
- remo_cli-4.3.5/frontend/src/state/workspace.ts +0 -451
- remo_cli-4.3.5/frontend/src/terminal/RendererAdapter.ts +0 -137
- remo_cli-4.3.5/frontend/src/terminal/TerminalConnection.test.ts +0 -280
- remo_cli-4.3.5/frontend/src/terminal/TerminalConnection.ts +0 -463
- remo_cli-4.3.5/frontend/src/terminal/XtermRenderer.ts +0 -260
- remo_cli-4.3.5/frontend/src/terminal/fitLoop.ts +0 -77
- remo_cli-4.3.5/install.sh +0 -252
- remo_cli-4.3.5/pyproject.toml +0 -78
- remo_cli-4.3.5/specs/010-web-session-interface/contracts/remo-host-protocol.md +0 -100
- remo_cli-4.3.5/src/remo_cli/cli/main.py +0 -304
- remo_cli-4.3.5/src/remo_cli/cli/web.py +0 -415
- remo_cli-4.3.5/src/remo_cli/core/config.py +0 -202
- remo_cli-4.3.5/src/remo_cli/core/known_hosts.py +0 -306
- remo_cli-4.3.5/src/remo_cli/core/provider_registry.py +0 -341
- remo_cli-4.3.5/src/remo_cli/core/reconcile.py +0 -522
- remo_cli-4.3.5/src/remo_cli/core/registry.py +0 -858
- remo_cli-4.3.5/src/remo_cli/core/remo_host_client.py +0 -460
- remo_cli-4.3.5/src/remo_cli/core/ssh.py +0 -649
- remo_cli-4.3.5/src/remo_cli/core/validation.py +0 -159
- remo_cli-4.3.5/src/remo_cli/core/web_adopt.py +0 -1995
- remo_cli-4.3.5/src/remo_cli/core/web_drift.py +0 -194
- remo_cli-4.3.5/src/remo_cli/models/discovery.py +0 -57
- remo_cli-4.3.5/src/remo_cli/models/host.py +0 -161
- remo_cli-4.3.5/src/remo_cli/providers/added.py +0 -490
- remo_cli-4.3.5/src/remo_cli/providers/aws_descriptor.py +0 -100
- remo_cli-4.3.5/src/remo_cli/providers/builtin.py +0 -19
- remo_cli-4.3.5/src/remo_cli/providers/incus_descriptor.py +0 -118
- remo_cli-4.3.5/src/remo_cli/providers/proxmox_descriptor.py +0 -144
- remo_cli-4.3.5/src/remo_cli/web/api/hosts.py +0 -225
- remo_cli-4.3.5/src/remo_cli/web/api/setup.py +0 -662
- remo_cli-4.3.5/src/remo_cli/web/api/terminals.py +0 -506
- remo_cli-4.3.5/src/remo_cli/web/app.py +0 -256
- remo_cli-4.3.5/src/remo_cli/web/check.py +0 -399
- remo_cli-4.3.5/src/remo_cli/web/config.py +0 -265
- remo_cli-4.3.5/src/remo_cli/web/discovery.py +0 -484
- remo_cli-4.3.5/src/remo_cli/web/health.py +0 -264
- remo_cli-4.3.5/src/remo_cli/web/models.py +0 -85
- remo_cli-4.3.5/src/remo_cli/web/terminal.py +0 -551
- remo_cli-4.3.5/src/remo_cli/web/terminal_registry.py +0 -221
- remo_cli-4.3.5/tests/integration/test_setup_payload_versions.py +0 -279
- remo_cli-4.3.5/tests/integration/test_web_adopt_e2e.py +0 -731
- remo_cli-4.3.5/tests/unit/cli/test_main.py +0 -297
- remo_cli-4.3.5/tests/unit/core/test_provider_registry.py +0 -241
- remo_cli-4.3.5/tests/unit/core/test_remo_host_client.py +0 -687
- remo_cli-4.3.5/tests/unit/core/test_ssh_identity_opts.py +0 -429
- remo_cli-4.3.5/tests/unit/core/test_validation.py +0 -380
- remo_cli-4.3.5/tests/unit/core/test_web_drift.py +0 -187
- remo_cli-4.3.5/tests/unit/core/test_web_push.py +0 -759
- remo_cli-4.3.5/tests/unit/providers/test_added_configure.py +0 -226
- remo_cli-4.3.5/tests/unit/providers/test_proxmox_devcontainer_runtime.py +0 -83
- remo_cli-4.3.5/tests/unit/test_ansible_templates.py +0 -312
- remo_cli-4.3.5/tests/unit/test_dependabot_config.py +0 -112
- remo_cli-4.3.5/tests/unit/test_schema_drift.py +0 -861
- remo_cli-4.3.5/tests/unit/web/fixtures/hosts_response.json +0 -1
- remo_cli-4.3.5/tests/unit/web/test_discovery.py +0 -368
- remo_cli-4.3.5/tests/unit/web/test_health_states.py +0 -304
- remo_cli-4.3.5/tests/unit/web/test_hosts_mapping.py +0 -72
- remo_cli-4.3.5/tests/unit/web/test_payload_equivalence.py +0 -122
- remo_cli-4.3.5/tests/unit/web/test_setup_api.py +0 -740
- remo_cli-4.3.5/tests/unit/web/test_setup_dormancy.py +0 -152
- remo_cli-4.3.5/tests/unit/web/test_terminals_api.py +0 -336
- remo_cli-4.3.5/uv.lock +0 -1477
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.claude/skills/speckit-analyze/SKILL.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.claude/skills/speckit-checklist/SKILL.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.claude/skills/speckit-clarify/SKILL.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.claude/skills/speckit-constitution/SKILL.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.claude/skills/speckit-converge/SKILL.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.claude/skills/speckit-git-commit/SKILL.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.claude/skills/speckit-git-feature/SKILL.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.claude/skills/speckit-git-initialize/SKILL.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.claude/skills/speckit-git-remote/SKILL.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.claude/skills/speckit-git-validate/SKILL.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.claude/skills/speckit-implement/SKILL.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.claude/skills/speckit-plan/SKILL.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.claude/skills/speckit-specify/SKILL.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.claude/skills/speckit-tasks/SKILL.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.claude/skills/speckit-taskstoissues/SKILL.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.devcontainer/devcontainer.json +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.dockerignore +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.github/CODEOWNERS +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.github/codeql/codeql-config.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.gitignore +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.maverick/checkpoints/feature/implementation_complete.json +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.maverick/checkpoints/feature/phase_${{ index }}_complete.json +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.maverick/checkpoints/feature/validation_complete.json +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/.registry +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/git/README.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/git/commands/speckit.git.commit.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/git/commands/speckit.git.feature.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/git/commands/speckit.git.initialize.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/git/commands/speckit.git.remote.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/git/commands/speckit.git.validate.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/git/config-template.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/git/extension.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/git/git-config.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/git/scripts/bash/create-new-feature.sh +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/git/scripts/bash/git-common.sh +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/git/scripts/bash/initialize-repo.sh +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/git/scripts/powershell/create-new-feature.ps1 +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/git/scripts/powershell/git-common.ps1 +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/extensions.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/init-options.json +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/integration.json +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/integrations/claude.manifest.json +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/integrations/speckit.manifest.json +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/scripts/bash/check-prerequisites.sh +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/scripts/bash/common.sh +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/scripts/bash/create-new-feature.sh +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/scripts/bash/setup-plan.sh +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/scripts/bash/setup-tasks.sh +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/scripts/bash/update-agent-context.sh +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/templates/agent-file-template.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/templates/checklist-template.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/templates/constitution-template.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/templates/spec-template.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/templates/tasks-template.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/workflows/speckit/workflow.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/.specify/workflows/workflow-registry.json +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/LICENSE +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/SECURITY.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/.ansible-lint +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/ansible.cfg +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/aws_configure.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/aws_resize.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/aws_site.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/aws_teardown.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/group_vars/all.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/group_vars/incus_containers.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/group_vars/proxmox_containers.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/hetzner_configure.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/hetzner_provision.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/hetzner_resize.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/hetzner_site.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/hetzner_teardown.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/incus_bootstrap.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/incus_configure.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/incus_provision.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/incus_resize.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/incus_site.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/incus_teardown.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/inventory/hosts.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/inventory/incus_containers.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/proxmox_bootstrap.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/proxmox_configure.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/proxmox_provision.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/proxmox_resize.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/proxmox_site.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/proxmox_teardown.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/requirements.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/aws_server/defaults/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/aws_server/tasks/ebs.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/aws_server/tasks/ec2.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/aws_server/tasks/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/aws_server/tasks/patch_manager.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/aws_server/tasks/preflight.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/aws_server/tasks/security_group.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/deacon/tasks/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/devcontainers/tasks/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/docker/handlers/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/docker/tasks/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/fzf/tasks/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/github_cli/tasks/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/hetzner_server/defaults/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/hetzner_server/tasks/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/incus_bootstrap/defaults/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/incus_bootstrap/handlers/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/incus_bootstrap/tasks/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/incus_container/defaults/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/incus_container/handlers/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/incus_container/meta/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/incus_container/tasks/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/incus_container/tasks/preflight.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/incus_container_teardown/defaults/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/incus_container_teardown/meta/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/incus_container_teardown/tasks/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/nested_docker/defaults/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/nested_docker/templates/devcontainer-shim.sh.j2 +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/nodejs/defaults/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/nodejs/files/nodesource-repo.gpg.key +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/nodejs/tasks/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/proxmox_bootstrap/defaults/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/proxmox_bootstrap/meta/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/proxmox_bootstrap/tasks/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/proxmox_container/defaults/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/proxmox_container/handlers/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/proxmox_container/meta/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/proxmox_container/tasks/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/proxmox_container/tasks/preflight.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/proxmox_container_teardown/defaults/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/proxmox_container_teardown/meta/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/proxmox_container_teardown/tasks/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/user_setup/tasks/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/user_setup/templates/devshell.sh.j2 +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/user_setup/templates/project-launch.sh.j2 +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/user_setup/templates/project-menu.sh.j2 +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/zellij/defaults/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/zellij/tasks/main.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/zellij/templates/config.kdl.j2 +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/roles/zellij/templates/layouts/minimal.kdl.j2 +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/ssh_configure.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/ansible/tasks/repair_apt_sources.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/docker/compose.example.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/docs/examples/orbstack-cloud-init-tailscale.yaml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/docs/examples/orbstack-cloud-init.yaml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/docs/hetzner.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/docs/incus.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/docs/maintaining-claude-md.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/docs/maintaining-generated-types.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/docs/remo-web-speckit-input.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/docs/remo-web.html +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/index.html +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/package-lock.json +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/package.json +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/playwright.config.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/playwright.geometry.config.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/scripts/check-types-fresh.mjs +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/scripts/generate-frame-types.mjs +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/scripts/generate-schema-types.mjs +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/api/generated/README.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/api/generated/terminal-frames.d.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/api/generated/terminal-frames.json +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/api/generated.test.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/AppRoot.tsx +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/AppShell.css +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/AwaitingAdoption.css +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/AwaitingAdoption.test.tsx +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/AwaitingAdoption.tsx +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/OfflineOverlay.css +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/OfflineOverlay.tsx +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/PairToSync.css +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/PairToSync.test.tsx +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/ShortcutsModal.css +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/ShortcutsModal.tsx +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/TopBar.css +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/TopBar.tsx +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/WorkspacePane.css +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/masterLayout.test.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/masterLayout.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/providerMeta.test.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/components/providerMeta.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/lib/clipboard.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/lib/fullscreen.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/state/discovery.test.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/state/discovery.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/state/fonts.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/state/latency.test.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/state/useConsoleKeyboard.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/state/workspace.test.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/terminal/.gitkeep +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/terminal/defaultRenderer.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/terminal/keymap.test.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/terminal/keymap.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/test/setup.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/theme/fonts.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/theme/terminalThemes.test.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/theme/terminalThemes.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/src/theme/tokens.css +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/tests/e2e/fixtures.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/tests/e2e/keyboard-routing.spec.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/tests/e2e/mobile.spec.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/tests/e2e/reconnect.spec.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/tests/e2e/terminal-shell-io.spec.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/tests/e2e/terminal-tui-compatibility.spec.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/tests/e2e/workspace-layout.spec.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/tests/geometry/global.d.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/tests/geometry/harness/index.html +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/tests/geometry/harness/main.tsx +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/tests/geometry/terminal-fit.spec.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/tsconfig.json +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/frontend/vite.config.ts +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/maverick.yaml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/project-menu.sh +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/release-please-config.json +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/remo +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/remo.svg +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/run.sh +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/scripts/export_openapi.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/scripts/palette-check.sh +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/scripts/setup-aws-oidc.sh +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/checklists/requirements.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/checklists/validation.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/contracts/playbook-interface.yaml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/contracts/role-interface.yaml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/data-model.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/plan.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/quickstart.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/research.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/spec.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/001-bootstrap-incus-host/tasks.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/002-incus-container-support/checklists/requirements.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/002-incus-container-support/contracts/playbook-interface.yaml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/002-incus-container-support/contracts/role-interface.yaml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/002-incus-container-support/data-model.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/002-incus-container-support/plan.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/002-incus-container-support/quickstart.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/002-incus-container-support/research.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/002-incus-container-support/spec.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/002-incus-container-support/tasks.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/003-python-cli-rewrite/checklists/requirements.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/003-python-cli-rewrite/data-model.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/003-python-cli-rewrite/plan.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/003-python-cli-rewrite/quickstart.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/003-python-cli-rewrite/research.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/003-python-cli-rewrite/spec.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/003-python-cli-rewrite/tasks.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/004-proxmox-container-support/spec.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/005-provider-snapshots/checklists/requirements.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/005-provider-snapshots/contracts/cli-surface.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/005-provider-snapshots/data-model.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/005-provider-snapshots/plan.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/005-provider-snapshots/quickstart.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/005-provider-snapshots/research.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/005-provider-snapshots/spec.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/005-provider-snapshots/tasks.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/010-web-session-interface/checklists/requirements.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/010-web-session-interface/contracts/rest-api.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/010-web-session-interface/contracts/terminal-websocket.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/010-web-session-interface/data-model.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/010-web-session-interface/plan.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/010-web-session-interface/quickstart.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/010-web-session-interface/research.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/010-web-session-interface/spec.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/010-web-session-interface/tasks.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/011-web-adopt/checklists/requirements.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/011-web-adopt/contracts/cli-web-adopt.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/011-web-adopt/contracts/setup-api.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/011-web-adopt/data-model.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/011-web-adopt/plan.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/011-web-adopt/quickstart-results.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/011-web-adopt/quickstart.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/011-web-adopt/research.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/011-web-adopt/spec.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/011-web-adopt/tasks.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/contracts/cli-web-adopt.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/contracts/pairing-api.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/contracts/setup-api.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/data-model.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/plan.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/quickstart.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/research.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/spec.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/012-web-adopt-pairing/tasks.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/013-managed-instance-tags/contracts/cli-sync.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/013-managed-instance-tags/contracts/marker-commands.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/013-managed-instance-tags/data-model.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/013-managed-instance-tags/plan.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/013-managed-instance-tags/quickstart.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/013-managed-instance-tags/research.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/013-managed-instance-tags/spec.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/013-managed-instance-tags/tasks.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/014-register-ssh-host/contracts/add-command.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/014-register-ssh-host/contracts/remove-command.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/014-register-ssh-host/data-model.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/014-register-ssh-host/plan.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/014-register-ssh-host/quickstart.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/014-register-ssh-host/research.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/014-register-ssh-host/spec.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/014-register-ssh-host/tasks.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/015-registry-v2/checklists/requirements.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/015-registry-v2/contracts/mirror-payload-v2.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/015-registry-v2/contracts/registry-accessor-api.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/015-registry-v2/contracts/registry-file-v2.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/015-registry-v2/data-model.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/015-registry-v2/plan.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/015-registry-v2/quickstart.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/015-registry-v2/research.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/015-registry-v2/spec.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/015-registry-v2/tasks.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/016-sync-reconcile/checklists/requirements.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/016-sync-reconcile/contracts/cli-sync.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/016-sync-reconcile/contracts/provider-probe.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/016-sync-reconcile/data-model.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/016-sync-reconcile/plan.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/016-sync-reconcile/quickstart.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/016-sync-reconcile/research.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/016-sync-reconcile/spec.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/016-sync-reconcile/tasks.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/checklists/requirements.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/contracts/cli-web-push.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/contracts/cli-web-status.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/contracts/revocation.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/contracts/setup-status-marker.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/data-model.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/plan.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/quickstart.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/research.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/spec.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/017-web-adopt-simplify/tasks.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/018-provider-abstraction/baseline-notes.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/018-provider-abstraction/checklists/requirements.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/018-provider-abstraction/contracts/cli-surface.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/018-provider-abstraction/contracts/errors.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/018-provider-abstraction/contracts/lifecycle-templates.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/018-provider-abstraction/contracts/provider-protocol.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/018-provider-abstraction/contracts/sync-merge.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/018-provider-abstraction/data-model.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/018-provider-abstraction/plan.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/018-provider-abstraction/quickstart.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/018-provider-abstraction/research.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/018-provider-abstraction/spec.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/018-provider-abstraction/tasks.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/checklists/requirements.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/contracts/cli-surface-delta.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/contracts/docs-structure-check.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/data-model.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/plan.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/quickstart.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/research.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/spec.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/019-hygiene-deps-docs/tasks.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/020-openapi-type-generation/checklists/requirements.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/020-openapi-type-generation/contracts/drift-checks.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/020-openapi-type-generation/contracts/terminal-frames-v1.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/020-openapi-type-generation/data-model.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/020-openapi-type-generation/plan.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/020-openapi-type-generation/quickstart.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/020-openapi-type-generation/research.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/020-openapi-type-generation/spec.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/020-openapi-type-generation/tasks.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/021-cli-plane-separation/contracts/cli-surface.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/021-cli-plane-separation/contracts/descriptor-schema.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/021-cli-plane-separation/data-model.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/021-cli-plane-separation/plan.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/021-cli-plane-separation/quickstart.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/021-cli-plane-separation/research.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/021-cli-plane-separation/spec.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/specs/021-cli-plane-separation/tasks.md +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/__main__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/cli/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/cli/added.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/cli/cp.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/cli/providers/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/cli/providers/factory.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/cli/shell.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/core/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/core/ansible_runner.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/core/completion.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/core/errors.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/core/lifecycle.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/core/output.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/core/picker.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/core/provider_protocol.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/core/rsync.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/core/snapshot.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/core/version.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/models/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/models/capability.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/models/session_target.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/models/snapshot.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/providers/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/providers/aws.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/providers/hetzner.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/providers/hetzner_descriptor.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/providers/incus.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/providers/proxmox.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/web/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/web/api/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/web/api/pairing.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/web/frames.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/web/logging_config.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/web/operator_auth.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/web/pairing.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/web/ssh_master.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/web/state.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/src/remo_cli/web/tokens.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/ansible/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/ansible/test_apt_sources_repair.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/ansible/test_authorized_keys_bootstrap.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/ansible/test_remo_host_idempotency.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/ansible/test_ssh_configure_connection.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/ansible/test_user_setup_docker_group.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/conftest.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/image/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/image/test_docker_image.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/integration/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/integration/_nine_terminal_fixture.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/integration/fish_completion.sh +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/integration/orbstack-cloud-init.yml +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/integration/orbstack.sh +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/integration/test_nine_terminals.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/integration/test_nine_terminals_soak.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/integration/test_registry_concurrency.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/integration/test_remo_host_e2e.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/integration/test_security_rejections.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/integration/test_sync_reconcile.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/integration/test_terminal_attach.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/integration/test_web_cli_parity.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/perf/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/perf/test_latency.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/perf/test_registry_perf.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/providers/test_aws_snapshot.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/providers/test_hetzner_snapshot.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/providers/test_incus_snapshot.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/providers/test_incus_sync_all.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/providers/test_proxmox_snapshot.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/providers/test_proxmox_sync_all.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/surface_baseline.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/test_add_cmd.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/test_cli_uniformity.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/test_configure_cmd.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/test_cp.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/test_remove_cmd.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/test_shell.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/test_shell_added.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/test_startup_imports.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/test_surface_preservation.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/cli/test_web_adopt_cmd.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_ansible_runner.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_completion.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_config.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_errors.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_known_hosts.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_lifecycle.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_migration_tagging_notice.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_output.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_picker.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_reconcile.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_registry_format.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_registry_locking.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_registry_migration.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_rsync.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_snapshot.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_ssh.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_ssh_added.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_ssh_controlpath.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_version.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_web_adopt_authorize.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_web_adopt_code.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_web_adopt_payload.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_web_adopt_trust.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/core/test_web_push_self_heal.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/models/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/models/test_capability.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/models/test_discovery.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/models/test_session_target.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/fake_provider.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_added_add.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_added_provider_guard.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_added_update_remove.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_added_verify.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_aws_provider_protocol.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_aws_snapshot.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_aws_sync.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_aws_upgrade_resize.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_hetzner_entry_adapters.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_hetzner_http.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_hetzner_label.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_hetzner_resize.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_hetzner_snapshot.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_hetzner_sync.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_host_user_consistency.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_incus_entry_adapters.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_incus_marker.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_incus_resize.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_incus_snapshot.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_incus_sync.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_missing_sdk.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_provider_conformance.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_provider_registry_entries.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_proxmox_marker.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_proxmox_provider_protocol.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_proxmox_resize.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_proxmox_snapshot.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/providers/test_proxmox_sync.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/test_architecture.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/test_devcontainer_shim.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/test_docs_examples.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/test_docs_structure.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/test_host_model.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/test_host_ssh_type.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/test_lockfile_version.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/test_workflow_action_pins.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/__init__.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/_pairing_support.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/conftest.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/fixtures/sessions_response.json +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/test_backpressure.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/test_check.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/test_csp.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/test_discovery_refresh_force.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/test_frames.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/test_lazy_import.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/test_log_redaction.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/test_mint_gating.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/test_operator_auth.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/test_pairing.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/test_pairing_origin.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/test_registry_readonly.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/test_service_identity_selection.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/test_setup_auth.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/test_state.py +0 -0
- {remo_cli-4.3.5 → remo_cli-4.4.0}/tests/unit/web/test_terminal_resize.py +0 -0
- {remo_cli-4.3.5 → 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
|