Explorar el Código

bumped packages

Tim Jones hace 3 días
padre
commit
2f12aa7ca6
Se han modificado 100 ficheros con 415 adiciones y 188 borrados
  1. 300 73
      AGENTS.md
  2. 4 4
      RackPeek.Domain/RackPeek.Domain.csproj
  3. 4 4
      RackPeek.Web.Viewer/RackPeek.Web.Viewer.csproj
  4. 11 11
      RackPeek/RackPeek.csproj
  5. 1 1
      Shared.Rcl/Commands/AccessPoints/AccessPointAddCommand.cs
  6. 1 1
      Shared.Rcl/Commands/AccessPoints/AccessPointDeleteCommand.cs
  7. 1 1
      Shared.Rcl/Commands/AccessPoints/AccessPointDescribeCommand.cs
  8. 1 1
      Shared.Rcl/Commands/AccessPoints/AccessPointGetByNameCommand.cs
  9. 1 1
      Shared.Rcl/Commands/AccessPoints/AccessPointGetCommand.cs
  10. 1 1
      Shared.Rcl/Commands/AccessPoints/AccessPointReportCommand.cs
  11. 1 1
      Shared.Rcl/Commands/AccessPoints/AccessPointSetCommand.cs
  12. 1 1
      Shared.Rcl/Commands/AccessPoints/Labels/AccessPointLabelAddCommand.cs
  13. 1 1
      Shared.Rcl/Commands/AccessPoints/Labels/AccessPointLabelRemoveCommand.cs
  14. 1 1
      Shared.Rcl/Commands/AccessPoints/Rename/AccessPointRenameCommand.cs
  15. 1 1
      Shared.Rcl/Commands/Connections/ConnectionAddCommand.cs
  16. 1 1
      Shared.Rcl/Commands/Connections/ConnectionRemoveCommand.cs
  17. 1 1
      Shared.Rcl/Commands/Desktops/Cpus/DesktopCpuAddCommand.cs
  18. 1 1
      Shared.Rcl/Commands/Desktops/Cpus/DesktopCpuRemoveCommand.cs
  19. 1 1
      Shared.Rcl/Commands/Desktops/Cpus/DesktopCpuSetCommand.cs
  20. 1 1
      Shared.Rcl/Commands/Desktops/DesktopAddCommand.cs
  21. 1 1
      Shared.Rcl/Commands/Desktops/DesktopDeleteCommand.cs
  22. 1 1
      Shared.Rcl/Commands/Desktops/DesktopDescribeCommand.cs
  23. 1 1
      Shared.Rcl/Commands/Desktops/DesktopGetByNameCommand.cs
  24. 1 1
      Shared.Rcl/Commands/Desktops/DesktopGetCommand.cs
  25. 1 1
      Shared.Rcl/Commands/Desktops/DesktopReportCommand.cs
  26. 1 1
      Shared.Rcl/Commands/Desktops/DesktopSetCommand.cs
  27. 1 1
      Shared.Rcl/Commands/Desktops/DesktopTreeCommand.cs
  28. 1 1
      Shared.Rcl/Commands/Desktops/Drive/DesktopDriveAddCommand.cs
  29. 1 1
      Shared.Rcl/Commands/Desktops/Drive/DesktopDriveRemoveCommand.cs
  30. 1 1
      Shared.Rcl/Commands/Desktops/Drive/DesktopDriveSetCommand.cs
  31. 1 1
      Shared.Rcl/Commands/Desktops/Gpus/DesktopGpuAddCommand.cs
  32. 1 1
      Shared.Rcl/Commands/Desktops/Gpus/DesktopGpuRemoveCommand.cs
  33. 1 1
      Shared.Rcl/Commands/Desktops/Gpus/DesktopGpuSetCommand.cs
  34. 1 1
      Shared.Rcl/Commands/Desktops/Labels/DesktopLabelAddCommand.cs
  35. 1 1
      Shared.Rcl/Commands/Desktops/Labels/DesktopLabelRemoveCommand.cs
  36. 1 1
      Shared.Rcl/Commands/Desktops/Nics/DesktopNicAddCommand.cs
  37. 1 1
      Shared.Rcl/Commands/Desktops/Nics/DesktopNicRemoveCommand.cs
  38. 1 1
      Shared.Rcl/Commands/Desktops/Nics/DesktopNicSetCommand.cs
  39. 1 1
      Shared.Rcl/Commands/Desktops/Rename/DesktopRenameCommand.cs
  40. 1 1
      Shared.Rcl/Commands/Exporters/GenerateAnsibleInventoryCommand.cs
  41. 1 1
      Shared.Rcl/Commands/Exporters/GenerateHostsFileCommand.cs
  42. 1 1
      Shared.Rcl/Commands/Exporters/GenerateSshConfigCommand.cs
  43. 1 1
      Shared.Rcl/Commands/Firewalls/FirewallAddCommand.cs
  44. 1 1
      Shared.Rcl/Commands/Firewalls/FirewallDeleteCommand.cs
  45. 1 1
      Shared.Rcl/Commands/Firewalls/FirewallDescribeCommand.cs
  46. 1 1
      Shared.Rcl/Commands/Firewalls/FirewallGetByNameCommand.cs
  47. 1 1
      Shared.Rcl/Commands/Firewalls/FirewallGetCommand.cs
  48. 1 1
      Shared.Rcl/Commands/Firewalls/FirewallReportCommand.cs
  49. 1 1
      Shared.Rcl/Commands/Firewalls/FirewallSetCommand.cs
  50. 1 1
      Shared.Rcl/Commands/Firewalls/Labels/FirewallLabelAddCommand.cs
  51. 1 1
      Shared.Rcl/Commands/Firewalls/Labels/FirewallLabelRemoveCommand.cs
  52. 1 1
      Shared.Rcl/Commands/Firewalls/Ports/FirewallPortAddCommand.cs
  53. 1 1
      Shared.Rcl/Commands/Firewalls/Ports/FirewallPortRemoveCommand.cs
  54. 1 1
      Shared.Rcl/Commands/Firewalls/Ports/FirewallPortUpdateCommand.cs
  55. 1 1
      Shared.Rcl/Commands/Firewalls/Rename/FirewallRenameCommand.cs
  56. 1 1
      Shared.Rcl/Commands/GetTotalSummaryCommand.cs
  57. 1 1
      Shared.Rcl/Commands/Laptops/Cpus/LaptopCpuAddCommand.cs
  58. 1 1
      Shared.Rcl/Commands/Laptops/Cpus/LaptopCpuRemoveCommand.cs
  59. 1 1
      Shared.Rcl/Commands/Laptops/Cpus/LaptopCpuSetCommand.cs
  60. 1 1
      Shared.Rcl/Commands/Laptops/Drive/LaptopDriveAddCommand.cs
  61. 1 1
      Shared.Rcl/Commands/Laptops/Drive/LaptopDriveRemoveCommand.cs
  62. 1 1
      Shared.Rcl/Commands/Laptops/Drive/LaptopDriveSetCommand.cs
  63. 1 1
      Shared.Rcl/Commands/Laptops/Gpus/LaptopGpuAddCommand.cs
  64. 1 1
      Shared.Rcl/Commands/Laptops/Gpus/LaptopGpuRemoveCommand.cs
  65. 1 1
      Shared.Rcl/Commands/Laptops/Gpus/LaptopGpuSetCommand.cs
  66. 1 1
      Shared.Rcl/Commands/Laptops/Labels/LaptopLabelAddCommand.cs
  67. 1 1
      Shared.Rcl/Commands/Laptops/Labels/LaptopLabelRemoveCommand.cs
  68. 1 1
      Shared.Rcl/Commands/Laptops/LaptopAddCommand.cs
  69. 1 1
      Shared.Rcl/Commands/Laptops/LaptopDeleteCommand.cs
  70. 1 1
      Shared.Rcl/Commands/Laptops/LaptopDescribeCommand.cs
  71. 1 1
      Shared.Rcl/Commands/Laptops/LaptopGetByNameCommand.cs
  72. 1 1
      Shared.Rcl/Commands/Laptops/LaptopGetCommand.cs
  73. 1 1
      Shared.Rcl/Commands/Laptops/LaptopReportCommand.cs
  74. 1 1
      Shared.Rcl/Commands/Laptops/LaptopSetCommand.cs
  75. 1 1
      Shared.Rcl/Commands/Laptops/LaptopTreeCommand.cs
  76. 1 1
      Shared.Rcl/Commands/Laptops/Rename/LaptopRenameCommand.cs
  77. 1 1
      Shared.Rcl/Commands/Routers/Labels/RouterLabelAddCommand.cs
  78. 1 1
      Shared.Rcl/Commands/Routers/Labels/RouterLabelRemoveCommand.cs
  79. 1 1
      Shared.Rcl/Commands/Routers/Ports/RouterPortAddCommand.cs
  80. 1 1
      Shared.Rcl/Commands/Routers/Ports/RouterPortRemoveCommand.cs
  81. 1 1
      Shared.Rcl/Commands/Routers/Ports/RouterPortUpdateCommand.cs
  82. 1 1
      Shared.Rcl/Commands/Routers/Rename/RouterRenameCommand.cs
  83. 1 1
      Shared.Rcl/Commands/Routers/RouterAddCommand.cs
  84. 1 1
      Shared.Rcl/Commands/Routers/RouterDeleteCommand.cs
  85. 1 1
      Shared.Rcl/Commands/Routers/RouterDescribeCommand.cs
  86. 1 1
      Shared.Rcl/Commands/Routers/RouterGetByNameCommand.cs
  87. 1 1
      Shared.Rcl/Commands/Routers/RouterGetCommand.cs
  88. 1 1
      Shared.Rcl/Commands/Routers/RouterReportCommand.cs
  89. 1 1
      Shared.Rcl/Commands/Routers/RouterSetCommand.cs
  90. 1 1
      Shared.Rcl/Commands/Servers/Cpus/ServerCpuAddCommand.cs
  91. 1 1
      Shared.Rcl/Commands/Servers/Cpus/ServerCpuRemoveCommand.cs
  92. 1 1
      Shared.Rcl/Commands/Servers/Cpus/ServerCpuSetCommand.cs
  93. 1 1
      Shared.Rcl/Commands/Servers/Drives/ServerDriveAddCommand.cs
  94. 1 1
      Shared.Rcl/Commands/Servers/Drives/ServerDriveRemoveCommand.cs
  95. 1 1
      Shared.Rcl/Commands/Servers/Drives/ServerDriveUpdateCommand.cs
  96. 1 1
      Shared.Rcl/Commands/Servers/Gpus/AddGpuUseCaseCommand.cs
  97. 1 1
      Shared.Rcl/Commands/Servers/Gpus/RemoveGpuUseCaseCommand.cs
  98. 1 1
      Shared.Rcl/Commands/Servers/Gpus/UpdateGpuUseCaseCommand.cs
  99. 1 1
      Shared.Rcl/Commands/Servers/Labels/ServerLabelAddCommand.cs
  100. 1 1
      Shared.Rcl/Commands/Servers/Labels/ServerLabelRemoveCommand.cs

+ 300 - 73
AGENTS.md

@@ -1,90 +1,317 @@
-# RackPeek — Agent Quick Reference
+# RackPeek — Agent Guide
 
 
-## Commands
+This document is the entry point for AI agents (Claude Code, OpenCode, etc.) working in this repo. It captures everything needed to understand the codebase, make a focused change, validate it, and open a PR without re-reading the whole tree.
+
+---
+
+## 1. What RackPeek is
+
+RackPeek is a **CLI + Web UI for documenting and managing home-lab / small-scale IT infrastructure** (servers, switches, routers, firewalls, access points, UPS units, desktops, laptops, systems, and services).
+
+- All state is persisted to a **single YAML file** (`config/config.yaml`) — no database.
+- Same domain code powers the CLI binary (`rpk`) and the Blazor Server Web UI.
+- Distributed as a Docker image (`aptacode/rackpeek`) and a self-contained CLI binary.
+- Live demo: <https://timmoth.github.io/RackPeek/> · Docs: <https://timmoth.github.io/RackPeek/docs/overview>
+
+### Core values (these shape design decisions)
+
+- **Simplicity** — narrow scope, no enterprise CMDB features.
+- **Openness** — open YAML format, user owns their data.
+- **Privacy** — no telemetry, no tracking.
+- **Dogfooding** — features must be useful to real home-labs.
+- **Opinionated** — built for home labs, not corporate documentation.
+
+If a proposed change conflicts with these values, push back before implementing.
+
+---
+
+## 2. Tech stack
+
+| Layer | Tech |
+|---|---|
+| Language | C# (.NET **10.0**, `net10.0` TFM) |
+| CLI | [Spectre.Console.Cli](https://spectreconsole.net/) |
+| Web UI | Blazor Server (`Microsoft.NET.Sdk.Web`) + a WASM viewer (`RackPeek.Web.Viewer`) for the live demo |
+| Persistence | YAML (`YamlDotNet`, `DocMigrator.Yaml`) — single file |
+| Git integration | `LibGit2Sharp` (optional, used when `GIT_TOKEN` is set) |
+| CLI tests | xUnit + `Spectre.Console.Testing` + `JsonSchema.Net` |
+| E2E tests | xUnit + `Microsoft.Playwright` + `Testcontainers` (spins up the real Docker image) |
+| Build runner | [`just`](https://github.com/casey/just) |
+| Container | `mcr.microsoft.com/dotnet/aspnet:10.0` — exposes port 8080 |
+| Code style | `dotnet format` (CI gate) + `.editorconfig` |
+| Analysis | `TreatWarningsAsErrors=true`, `EnforceCodeStyleInBuild=true`, latest analyzers (see `Directory.Build.props`) |
+
+**.NET 10 is required.** If `dotnet --version` shows < 10, see `docs/development/dev-setup.md`. A devcontainer is included (`.devcontainer/`).
+
+---
+
+## 3. Solution layout
+
+```
+RackPeek.sln
+├── RackPeek/                  CLI entry point (Spectre.Console.Cli) → produces `rpk`
+├── RackPeek.Domain/           Core domain: resources, use-cases, persistence, git
+│   ├── Resources/             Resource models (Server, Switch, System, Service, …)
+│   ├── UseCases/              Generic use-cases (Add, Delete, Rename, Cpus, Drives, Gpus, Ports, Labels, Tags, Ansible, SSH, Hosts)
+│   ├── Persistence/           IResourceCollection, Yaml repositories, migrations
+│   │   └── Yaml/              YamlResourceCollection, RackPeekConfigMigrationDeserializer, ResourceYamlMigrationService
+│   ├── Git/                   Optional LibGit2Sharp integration (NullGitRepository when disabled)
+│   ├── Api/                   InventoryRequest/Response + UpsertInventoryUseCase (used by Web API)
+│   └── ServiceCollectionExtensions.cs   DI: AddUseCases / AddYamlRepos / AddGitServices
+├── Shared.Rcl/                Razor Class Library: Blazor components AND CLI command wiring shared between Web + CLI
+│   ├── Commands/              Spectre.Console.Cli command classes (one folder per resource kind)
+│   ├── Components/            Shared Razor components
+│   ├── Modals/, Layout/, Services/, Console/
+│   ├── CliBootstrap.cs        Registers all CLI commands + DI internals (single source of truth for the `rpk` command tree)
+│   └── ConsoleRunner.cs       Lets the Web UI execute CLI commands in-process
+├── RackPeek.Web/              Blazor Server host (Dockerfile lives here)
+├── RackPeek.Web.Viewer/       Blazor WebAssembly viewer (powers the github-pages demo)
+├── Tests/                     CLI integration tests (xUnit) — fast, no Docker
+│   ├── EndToEnd/              Per-resource workflow tests using the real CLI
+│   ├── Api/                   Web API endpoint tests (Microsoft.AspNetCore.Mvc.Testing)
+│   ├── TestConfigs/v1,v2,v3/  Fixture YAML files for migration tests
+│   └── schemas/               JSON schemas validated against output
+└── Tests.E2e/                 Playwright + Testcontainers — spins up the Docker image and drives the Web UI
+    ├── PageObjectModels/      One POM per page/component (required pattern)
+    └── Infra/PlaywrightFixture.cs   Container + browser lifecycle
+```
+
+### Where to put new code
+
+| You're adding… | Goes in… |
+|---|---|
+| A new CLI subcommand | `Shared.Rcl/Commands/<ResourceKind>/…` + register it in `Shared.Rcl/CliBootstrap.cs` |
+| A new resource kind | `RackPeek.Domain/Resources/<Kind>/` model, register in `Resource.cs` maps, add YAML migration, wire repos in `ServiceCollectionExtensions.cs`, add Razor pages under `Shared.Rcl/<Kind>/`, add Web routing |
+| A new use-case | `RackPeek.Domain/UseCases/` — implement `IUseCase` (auto-registered by reflection in `AddUseCases`) or the generic `IResourceUseCase<T>` |
+| A new Razor component used by CLI+Web | `Shared.Rcl/Components/` |
+| A new Web page only | `RackPeek.Web/Components/` |
+| A YAML schema change | Bump schema version under `schemas/vN/` + add migration in `RackPeek.Domain/Persistence/Yaml/` + add migration test in `Tests/TestConfigs/vN/` |
+
+---
+
+## 4. Build, test, run
+
+All workflow commands go through `justfile`. Prefer `just <target>` over running `dotnet` directly so behaviour stays consistent with CI.
+
+### Build
 
 
-**Build & Test**
 ```bash
 ```bash
-just build              # dotnet build RackPeek.sln
-just test-all           # CLI + E2E tests (rebuilds Web image)
-just ci                 # alias for test-all (matches CI checklist)
-just test-cli           # dotnet test Tests/Tests.csproj
-just test-e2e           # requires just build-web first
+just build              # dotnet build RackPeek.sln (Debug)
+just build-release      # Release
+just build-cli          # publish self-contained single-file binary (default linux-x64)
+just build-cli linux-arm64    # cross-target
+just build-web          # docker build -t rackpeek:ci -f RackPeek.Web/Dockerfile .
 ```
 ```
 
 
-**Run Locally**
+### Test
+
 ```bash
 ```bash
-just run-docker         # builds and starts Docker container on :8080
-just rpk [args]         # run CLI directly from debug build
+just test-cli           # fast CLI tests, no Docker required
+just e2e-setup          # ONCE: installs Playwright CLI + browsers
+just test-e2e           # implies build-web; runs Playwright suite
+just test-all           # = build-web + e2e-setup + test-cli + test-e2e
+just ci                 # alias for test-all — matches the pre-PR checklist
 ```
 ```
 
 
-**E2E Setup** (first time only)
+CI order (`.github/workflows/test.yml`):
+
+1. **`format`** → `dotnet format --verify-no-changes` (runs on `ubuntu-latest`)
+2. **`cli-tests`** → `dotnet test Tests` (runs on `ubuntu-latest`, depends on format)
+3. **`webui-tests`** → builds the docker image then runs `dotnet test Tests.E2e` (runs on `ubuntu-24.04`, depends on cli-tests)
+
+Always run `dotnet format` before commit — formatting breaks CI first.
+
+### Run
+
 ```bash
 ```bash
-just e2e-setup          # installs Playwright CLI + browsers
+just run-docker         # build + run container on http://localhost:8080
+just rpk [args]         # run CLI directly from Debug build
+just clean              # dotnet clean
 ```
 ```
 
 
-**Demo**
+### Release
+
 ```bash
 ```bash
-just build-cli-demo     # VHS CLI demo (needs: vhs, imagemagick, chrome)
-just build-web-demo     # Web UI demo (needs: Chrome, ImageMagick)
+just docker-push 1.3.2  # multi-arch (linux/amd64, linux/arm64) push to aptacode/rackpeek
 ```
 ```
 
 
-**Release**
+CLI binary version is bumped in `RackPeek/RackPeek.csproj` (`<AssemblyVersion>`).
+
+### Demos (rarely needed by agents)
+
 ```bash
 ```bash
-just docker-push <ver>  # multi-arch Docker push (e.g., just docker-push 1.3.0)
+just build-cli-demo     # VHS recording — needs vhs, imagemagick, chrome
+just build-web-demo     # GIF capture — needs Chrome, ImageMagick
 ```
 ```
 
 
-## Workflow
-
-1. **CI order**: `format → cli-tests → webui-tests`
-2. **PR checklist**:
-   - Linked GitHub issue
-   - Approach validated with maintainers
-   - Small, focused PR
-   - CLI tests passing locally
-   - E2E tests passing locally
-   - YAML migration defined if persisting changes
-
-3. **Draft PR** until:
-   - All tests pass locally
-   - Scope complete
-   - Debug code removed
-
-## Architecture
-
-**Solution structure**:
-- `RackPeek/` — CLI application
-- `RackPeek.Domain/` — shared domain models
-- `RackPeek.Web/` — Web UI (Blazor)
-- `RackPeek.Web.Viewer/` — Web UI viewer
-- `Shared.Rcl/` — shared Blazor components
-- `Tests/` — CLI unit tests
-- `Tests.E2e/` — Playwright E2E tests
-
-**Key files**:
-- `justfile` — developer workflow commands
-- `.github/workflows/test.yml` — CI pipeline
-- `RackPeek.sln` — solution root
-- `docs/development/` — dev guides (dev-cheat-sheet.md, testing-guidelines.md)
-
-## Gotchas
-
-- **E2E tests require Docker image**: run `just build-web` before `just test-e2e`
-- **Playwright browsers** installed via `just e2e-setup` (first time)
-- **CI runs on `ubuntu-latest`** (CLI tests) and `ubuntu-24.04` (WebUI)
-- **Docker image tag**: `rackpeek:ci` used locally, `aptacode/rackpeek` on registry
-- **Format check**: `dotnet format --verify-no-changes` (CI step 1)
-- **Debugging E2E**: Set `Headless = false, SlowMo = 500` in `PlaywrightFixture.cs`, revert before commit
-- **YAML changes**: Always define migration if modifying persisted schema
-
-## Testing
-
-- **CLI tests**: `dotnet test Tests/Tests.csproj` (fast, no Docker)
-- **E2E tests**: `dotnet test Tests.E2e` (requires Docker image, Playwright browsers)
-- **Full suite**: `just ci` or `just test-all`
-
-## Docs References
-
-- `docs/development/contribution-guidelines.md` — PR process
-- `docs/development/dev-cheat-sheet.md` — build/release details
-- `docs/development/testing-guidelines.md` — testing principles
-- `README.md` — overview and Docker usage
+---
+
+## 5. Code style
+
+Enforced by CI via `dotnet format --verify-no-changes`. From `.editorconfig` + `Directory.Build.props`:
+
+- 4-space indent, LF line endings, final newline, UTF-8.
+- `var` for built-in types and when the type is apparent; explicit type otherwise.
+- Expression-bodied members only when on a single line.
+- Private fields are `_camelCase` (underscore prefix, error severity).
+- Open braces on a new line (Allman) — `csharp_new_line_before_open_brace = all:error`.
+- **Warnings are errors** repo-wide. Don't introduce nullable warnings or analyzer warnings.
+- Nullable reference types enabled in every project (`<Nullable>enable</Nullable>`).
+
+Default to writing no comments. The project favours readable names + tests-as-documentation.
+
+---
+
+## 6. Persistence model (important)
+
+There is **one YAML file**: `config/config.yaml` (or the path given by `RPK_YAML_DIR` env var; the Docker image sets it to `/app/config`).
+
+Top-level shape:
+
+```yaml
+resources:
+  - kind: Server | Switch | Firewall | Router | Accesspoint | Desktop | Laptop | Ups | System | Service
+    name: <unique name within kind>
+    tags: [...]
+    labels: { key: value }
+    notes: |
+      free-form markdown
+    runsOn: [<parent-resource-name>, ...]   # only meaningful for System / Service
+    # kind-specific fields follow (e.g. ports[], cpus[], drives[], gpus[], nics[], network, ram, …)
+```
+
+Key invariants (see `RackPeek.Domain/Resources/Resource.cs`):
+
+- `name` is the identity within a `kind`. Don't introduce numeric IDs.
+- `runsOn` relationships are validated by `Resource.CanRunOn<T>`:
+  - `Service` may run on a `System`.
+  - `System` may run on hardware (`Server`, `Switch`, `Firewall`, `Router`, `Accesspoint`, `Desktop`, `Laptop`, `Ups`) or on another `System`.
+- "Hardware" is the umbrella term for the eight physical kinds above (`Resource.IsHardware`).
+- Anything that mutates the YAML must go through an `IResourceUseCase<T>` → `IResourceCollection` → repository, never direct file writes.
+
+### YAML migrations
+
+Schemas are versioned under `schemas/v1`, `schemas/v2`, `schemas/v3`. Migration code lives in `RackPeek.Domain/Persistence/Yaml/`:
+
+- `RackPeekConfigMigrationDeserializer.cs` — deserialisation entry point
+- `ResourceYamlMigrationService.cs` — applies the version chain
+
+When you change persisted YAML shape, the PR **must** include:
+
+1. A new `schemas/vN+1/schema.vN+1.json`.
+2. A forward migration that reads vN and emits vN+1.
+3. Test fixtures under `Tests/TestConfigs/vN+1/` (note the explicit `<None Update>` entries in `Tests/Tests.csproj` if you add new files).
+4. Backwards compatibility for at least vN, OR a clearly documented breaking change.
+
+---
+
+## 7. CLI surface
+
+The full command tree is documented in `docs/Commands.md` and `docs/CommandIndex.md` (auto-generated by `generate-docs.sh`). At a glance:
+
+```
+rpk <kind> <verb> [name] [flags]
+
+kinds:   summary, servers, switches, routers, firewalls, systems,
+         accesspoints, ups, desktops, laptops, services
+verbs:   summary, add, list, get, describe, set, del, tree
+sub:     cpu, drive, gpu, nic, port, subnets, labels, tags, rename, …
+```
+
+When adding/altering commands, regenerate the docs (`./generate-docs.sh`) so the published reference stays in sync.
+
+---
+
+## 8. Environment variables
+
+| Var | Default | Purpose |
+|---|---|---|
+| `RPK_YAML_DIR` | `config` (CLI) / `/app/config` (Docker) | Directory containing `config.yaml` |
+| `GIT_TOKEN` | unset | If set, enables `LibGit2GitRepository` for the config dir |
+| `GIT_USERNAME` | `git` | Username paired with `GIT_TOKEN` |
+| `ASPNETCORE_URLS` | `http://+:8080` (Docker) | Web UI bind |
+
+---
+
+## 9. Testing principles
+
+Read `docs/development/testing-guidelines.md` in full before touching tests. Highlights:
+
+- **Test at the edges.** Black-box integration tests over micro-mocked unit tests. If a refactor breaks a test without changing observable behaviour, the test was too coupled.
+- **CLI tests** (`Tests/`) drive the real `CommandApp`, assert exact stdout, and inspect the YAML written to disk. Use the `ExecuteAsync(...)` helper pattern.
+- **E2E tests** (`Tests.E2e/`) use Testcontainers to run the real Docker image then drive the Web UI via Playwright. Every page has a Page Object Model (POM) in `Tests.E2e/PageObjectModels/`. Tests should read like workflows, not browser scripts.
+- E2E tests must be **independent, idempotent, and self-cleaning** — generate unique names with `Guid.NewGuid()` and delete what you create.
+- Treat every bug as a missing test: reproduce with a failing test, then fix.
+- Fix flakiness immediately; don't retry.
+
+### Adding a feature checklist
+
+- [ ] CLI test covering happy + at least one unhappy path (output + YAML side-effect)
+- [ ] E2E test for the corresponding Web UI flow (if there is one)
+- [ ] YAML migration + migration test (if persisted shape changed)
+- [ ] `dotnet format` clean
+- [ ] `just ci` green locally
+
+---
+
+## 10. Pull-request workflow
+
+From `docs/development/contribution-guidelines.md`:
+
+1. **Find / open a GitHub issue first.** Validate approach with maintainers before coding (issues > Discord for design discussion).
+2. Keep PRs **small and focused** — one concern per PR.
+3. Open as **Draft**; move to Ready only when:
+   - All tests pass locally (`just ci`)
+   - Scope is complete
+   - No debug code left in (especially `Headless = false` in `PlaywrightFixture.cs`)
+4. Pre-PR checklist (mirror in PR body):
+   - [ ] Linked GitHub issue
+   - [ ] Approach validated
+   - [ ] Small, focused PR
+   - [ ] CLI tests passing locally
+   - [ ] E2E tests passing locally
+   - [ ] Behaviour covered by tests
+   - [ ] YAML migration defined (if persisted shape changed)
+
+Default branches: feature work targets `staging`; releases flow `staging → main`.
+
+---
+
+## 11. Gotchas
+
+- **E2E tests require the Docker image.** `just test-e2e` rebuilds it via `just build-web`. If you change anything in `RackPeek.Web`, `RackPeek.Domain`, or `Shared.Rcl`, the image must be rebuilt before E2E runs.
+- **Playwright browsers** are installed once via `just e2e-setup`. In CI they're cached under `~/.cache/ms-playwright`.
+- **Docker image tag** is `rackpeek:ci` locally (referenced by `Tests.E2e/Infra/PlaywrightFixture.cs:9`); the registry tag is `aptacode/rackpeek`.
+- **Debugging E2E**: temporarily set `Headless = false, SlowMo = 1500` in `Tests.E2e/Infra/PlaywrightFixture.cs`. **Always revert before commit** — CI requires headless.
+- **TreatWarningsAsErrors** — a stray `unused-variable` warning fails the whole build. Don't add `#pragma warning disable` to push through; fix the warning.
+- **Git integration** is optional and silently no-ops when `GIT_TOKEN` is absent (`NullGitRepository`). Don't assume git is wired up.
+- **Single YAML file**: concurrent writes from CLI + Web are not coordinated beyond file replacement. Treat the Web UI as the source of truth while it's running.
+- The `RackPeek.Web/config copy/` directory looks like cruft but is checked-in — leave it alone unless cleaning up is the explicit goal.
+- The Web Docker image bundles **both** the Web app and the CLI binary (`rpk` is placed in `/usr/local/bin`). You can `docker exec rackpeek rpk ...` against a running container.
+
+---
+
+## 12. Reference
+
+| Path | What |
+|---|---|
+| `justfile` | Single source of truth for developer commands |
+| `RackPeek.sln` | Solution root |
+| `Directory.Build.props` | Repo-wide MSBuild props (analyzers, warnings-as-errors) |
+| `.editorconfig` | Formatting + naming rules |
+| `.github/workflows/test.yml` | CI pipeline (format → cli-tests → webui-tests) |
+| `.github/workflows/publish-*.yml` | Release pipelines |
+| `RackPeek.Web/Dockerfile` | Multi-stage build for the runtime image |
+| `RackPeek/Program.cs` | CLI entry point |
+| `RackPeek.Web/Program.cs` | Web entry point + DI wiring |
+| `Shared.Rcl/CliBootstrap.cs` | Master CLI command registration |
+| `RackPeek.Domain/ServiceCollectionExtensions.cs` | Domain DI registration |
+| `RackPeek.Domain/Resources/Resource.cs` | Resource base + kind/relationship rules |
+| `docs/development/contribution-guidelines.md` | PR process |
+| `docs/development/dev-cheat-sheet.md` | Build / release / Docker / Playwright details |
+| `docs/development/dev-setup.md` | First-time environment setup |
+| `docs/development/testing-guidelines.md` | Testing philosophy + examples |
+| `docs/Commands.md` / `docs/CommandIndex.md` | Auto-generated CLI reference |
+| `schemas/v1,v2,v3/` | Versioned YAML schemas |
+| `README.md` | User-facing overview, Docker install, links |
+| `LICENSE` | License terms |

+ 4 - 4
RackPeek.Domain/RackPeek.Domain.csproj

@@ -9,10 +9,10 @@
     <ItemGroup>
     <ItemGroup>
         <PackageReference Include="DocMigrator.Yaml" Version="10.0.3" />
         <PackageReference Include="DocMigrator.Yaml" Version="10.0.3" />
         <PackageReference Include="LibGit2Sharp" Version="0.31.0" />
         <PackageReference Include="LibGit2Sharp" Version="0.31.0" />
-        <PackageReference Include="Microsoft.Extensions.Configuration" Version="10.0.3" />
-        <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.3" />
-        <PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.3" />
-        <PackageReference Include="YamlDotNet" Version="16.3.0" />
+        <PackageReference Include="Microsoft.Extensions.Configuration" Version="10.0.8" />
+        <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.8" />
+        <PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.8" />
+        <PackageReference Include="YamlDotNet" Version="17.1.0" />
     </ItemGroup>
     </ItemGroup>
 
 
 </Project>
 </Project>

+ 4 - 4
RackPeek.Web.Viewer/RackPeek.Web.Viewer.csproj

@@ -8,10 +8,10 @@
     </PropertyGroup>
     </PropertyGroup>
 
 
     <ItemGroup>
     <ItemGroup>
-        <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.3"/>
-        <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.3" PrivateAssets="all"/>
-        <PackageReference Include="Spectre.Console.Cli" Version="0.53.1"/>
-        <PackageReference Include="Spectre.Console.Testing" Version="0.54.0"/>
+        <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.8"/>
+        <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.8" PrivateAssets="all"/>
+        <PackageReference Include="Spectre.Console.Cli" Version="0.55.0"/>
+        <PackageReference Include="Spectre.Console.Testing" Version="0.55.2"/>
     </ItemGroup>
     </ItemGroup>
 
 
     <ItemGroup>
     <ItemGroup>

+ 11 - 11
RackPeek/RackPeek.csproj

@@ -9,17 +9,17 @@
     </PropertyGroup>
     </PropertyGroup>
 
 
     <ItemGroup>
     <ItemGroup>
-        <PackageReference Include="Microsoft.Extensions.Configuration" Version="10.0.3"/>
-        <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="10.0.3"/>
-        <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="10.0.3"/>
-        <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="10.0.3"/>
-        <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.3"/>
-        <PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.3"/>
-        <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.3"/>
-        <PackageReference Include="Spectre.Console" Version="0.54.0"/>
-        <PackageReference Include="Spectre.Console.Cli" Version="0.53.1"/>
-        <PackageReference Include="Spectre.Console.Testing" Version="0.54.0"/>
-        <PackageReference Include="YamlDotNet" Version="16.3.0"/>
+        <PackageReference Include="Microsoft.Extensions.Configuration" Version="10.0.8"/>
+        <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="10.0.8"/>
+        <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="10.0.8"/>
+        <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="10.0.8"/>
+        <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.8"/>
+        <PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.8"/>
+        <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.8"/>
+        <PackageReference Include="Spectre.Console" Version="0.55.2"/>
+        <PackageReference Include="Spectre.Console.Cli" Version="0.55.0"/>
+        <PackageReference Include="Spectre.Console.Testing" Version="0.55.2"/>
+        <PackageReference Include="YamlDotNet" Version="17.1.0"/>
     </ItemGroup>
     </ItemGroup>
 
 
     <ItemGroup>
     <ItemGroup>

+ 1 - 1
Shared.Rcl/Commands/AccessPoints/AccessPointAddCommand.cs

@@ -16,7 +16,7 @@ public class AccessPointAddSettings : CommandSettings {
 public class AccessPointAddCommand(
 public class AccessPointAddCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<AccessPointAddSettings> {
 ) : AsyncCommand<AccessPointAddSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         AccessPointAddSettings settings,
         AccessPointAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/AccessPoints/AccessPointDeleteCommand.cs

@@ -9,7 +9,7 @@ namespace Shared.Rcl.Commands.AccessPoints;
 public class AccessPointDeleteCommand(
 public class AccessPointDeleteCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<AccessPointNameSettings> {
 ) : AsyncCommand<AccessPointNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         AccessPointNameSettings settings,
         AccessPointNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/AccessPoints/AccessPointDescribeCommand.cs

@@ -9,7 +9,7 @@ namespace Shared.Rcl.Commands.AccessPoints;
 public class AccessPointDescribeCommand(
 public class AccessPointDescribeCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<AccessPointNameSettings> {
 ) : AsyncCommand<AccessPointNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         AccessPointNameSettings settings,
         AccessPointNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/AccessPoints/AccessPointGetByNameCommand.cs

@@ -9,7 +9,7 @@ namespace Shared.Rcl.Commands.AccessPoints;
 public class AccessPointGetByNameCommand(
 public class AccessPointGetByNameCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<AccessPointNameSettings> {
 ) : AsyncCommand<AccessPointNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         AccessPointNameSettings settings,
         AccessPointNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/AccessPoints/AccessPointGetCommand.cs

@@ -9,7 +9,7 @@ namespace Shared.Rcl.Commands.AccessPoints;
 public class AccessPointGetCommand(
 public class AccessPointGetCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand {
 ) : AsyncCommand {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();

+ 1 - 1
Shared.Rcl/Commands/AccessPoints/AccessPointReportCommand.cs

@@ -13,7 +13,7 @@ public class AccessPointReportCommand(
 ) : AsyncCommand {
 ) : AsyncCommand {
     private readonly ILogger<AccessPointReportCommand> _logger = logger;
     private readonly ILogger<AccessPointReportCommand> _logger = logger;
 
 
-    public override async Task<int> ExecuteAsync(CommandContext context, CancellationToken cancellationToken) {
+    protected override async Task<int> ExecuteAsync(CommandContext context, CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();
         AccessPointHardwareReportUseCase useCase =
         AccessPointHardwareReportUseCase useCase =
             scope.ServiceProvider.GetRequiredService<AccessPointHardwareReportUseCase>();
             scope.ServiceProvider.GetRequiredService<AccessPointHardwareReportUseCase>();

+ 1 - 1
Shared.Rcl/Commands/AccessPoints/AccessPointSetCommand.cs

@@ -20,7 +20,7 @@ public class AccessPointSetSettings : ServerNameSettings {
 public class AccessPointSetCommand(
 public class AccessPointSetCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<AccessPointSetSettings> {
 ) : AsyncCommand<AccessPointSetSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         AccessPointSetSettings settings,
         AccessPointSetSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/AccessPoints/Labels/AccessPointLabelAddCommand.cs

@@ -12,7 +12,7 @@ public class AccessPointLabelAddSettings : AccessPointNameSettings {
 }
 }
 
 
 public class AccessPointLabelAddCommand(IServiceProvider serviceProvider) : AsyncCommand<AccessPointLabelAddSettings> {
 public class AccessPointLabelAddCommand(IServiceProvider serviceProvider) : AsyncCommand<AccessPointLabelAddSettings> {
-    public override async Task<int> ExecuteAsync(CommandContext context, AccessPointLabelAddSettings settings,
+    protected override async Task<int> ExecuteAsync(CommandContext context, AccessPointLabelAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();
         IAddLabelUseCase<AccessPoint> useCase =
         IAddLabelUseCase<AccessPoint> useCase =

+ 1 - 1
Shared.Rcl/Commands/AccessPoints/Labels/AccessPointLabelRemoveCommand.cs

@@ -12,7 +12,7 @@ public class AccessPointLabelRemoveSettings : AccessPointNameSettings {
 
 
 public class AccessPointLabelRemoveCommand(IServiceProvider serviceProvider)
 public class AccessPointLabelRemoveCommand(IServiceProvider serviceProvider)
     : AsyncCommand<AccessPointLabelRemoveSettings> {
     : AsyncCommand<AccessPointLabelRemoveSettings> {
-    public override async Task<int> ExecuteAsync(CommandContext context, AccessPointLabelRemoveSettings settings,
+    protected override async Task<int> ExecuteAsync(CommandContext context, AccessPointLabelRemoveSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();
         IRemoveLabelUseCase<AccessPoint> useCase =
         IRemoveLabelUseCase<AccessPoint> useCase =

+ 1 - 1
Shared.Rcl/Commands/AccessPoints/Rename/AccessPointRenameCommand.cs

@@ -14,7 +14,7 @@ public class AccessPointRenameSettings : AccessPointNameSettings {
 public class AccessPointRenameCommand(
 public class AccessPointRenameCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<AccessPointRenameSettings> {
 ) : AsyncCommand<AccessPointRenameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         AccessPointRenameSettings settings,
         AccessPointRenameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Connections/ConnectionAddCommand.cs

@@ -43,7 +43,7 @@ public class ConnectionAddSettings : CommandSettings {
 public class ConnectionAddCommand(
 public class ConnectionAddCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<ConnectionAddSettings> {
 ) : AsyncCommand<ConnectionAddSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         ConnectionAddSettings settings,
         ConnectionAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Connections/ConnectionRemoveCommand.cs

@@ -23,7 +23,7 @@ public class ConnectionRemoveSettings : CommandSettings {
 public class ConnectionRemoveCommand(
 public class ConnectionRemoveCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<ConnectionRemoveSettings> {
 ) : AsyncCommand<ConnectionRemoveSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         ConnectionRemoveSettings settings,
         ConnectionRemoveSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/Cpus/DesktopCpuAddCommand.cs

@@ -27,7 +27,7 @@ public class DesktopCpuAddSettings : CommandSettings {
 
 
 public class DesktopCpuAddCommand(IServiceProvider provider)
 public class DesktopCpuAddCommand(IServiceProvider provider)
     : AsyncCommand<DesktopCpuAddSettings> {
     : AsyncCommand<DesktopCpuAddSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopCpuAddSettings settings,
         DesktopCpuAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/Cpus/DesktopCpuRemoveCommand.cs

@@ -19,7 +19,7 @@ public class DesktopCpuRemoveSettings : CommandSettings {
 
 
 public class DesktopCpuRemoveCommand(IServiceProvider provider)
 public class DesktopCpuRemoveCommand(IServiceProvider provider)
     : AsyncCommand<DesktopCpuRemoveSettings> {
     : AsyncCommand<DesktopCpuRemoveSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopCpuRemoveSettings settings,
         DesktopCpuRemoveSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/Cpus/DesktopCpuSetCommand.cs

@@ -30,7 +30,7 @@ public class DesktopCpuSetSettings : CommandSettings {
 }
 }
 
 
 public class DesktopCpuSetCommand(IServiceProvider provider) : AsyncCommand<DesktopCpuSetSettings> {
 public class DesktopCpuSetCommand(IServiceProvider provider) : AsyncCommand<DesktopCpuSetSettings> {
-    public override async Task<int> ExecuteAsync(CommandContext context, DesktopCpuSetSettings settings,
+    protected override async Task<int> ExecuteAsync(CommandContext context, DesktopCpuSetSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {
         using IServiceScope scope = provider.CreateScope();
         using IServiceScope scope = provider.CreateScope();
         IUpdateCpuUseCase<Desktop> useCase = scope.ServiceProvider.GetRequiredService<IUpdateCpuUseCase<Desktop>>();
         IUpdateCpuUseCase<Desktop> useCase = scope.ServiceProvider.GetRequiredService<IUpdateCpuUseCase<Desktop>>();

+ 1 - 1
Shared.Rcl/Commands/Desktops/DesktopAddCommand.cs

@@ -8,7 +8,7 @@ namespace Shared.Rcl.Commands.Desktops;
 
 
 public class DesktopAddCommand(IServiceProvider provider)
 public class DesktopAddCommand(IServiceProvider provider)
     : AsyncCommand<DesktopNameSettings> {
     : AsyncCommand<DesktopNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopNameSettings settings,
         DesktopNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/DesktopDeleteCommand.cs

@@ -8,7 +8,7 @@ namespace Shared.Rcl.Commands.Desktops;
 
 
 public class DesktopDeleteCommand(IServiceProvider provider)
 public class DesktopDeleteCommand(IServiceProvider provider)
     : AsyncCommand<DesktopNameSettings> {
     : AsyncCommand<DesktopNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopNameSettings settings,
         DesktopNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/DesktopDescribeCommand.cs

@@ -8,7 +8,7 @@ namespace Shared.Rcl.Commands.Desktops;
 
 
 public class DesktopDescribeCommand(IServiceProvider provider)
 public class DesktopDescribeCommand(IServiceProvider provider)
     : AsyncCommand<DesktopNameSettings> {
     : AsyncCommand<DesktopNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopNameSettings settings,
         DesktopNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/DesktopGetByNameCommand.cs

@@ -8,7 +8,7 @@ namespace Shared.Rcl.Commands.Desktops;
 
 
 public class DesktopGetByNameCommand(IServiceProvider provider)
 public class DesktopGetByNameCommand(IServiceProvider provider)
     : AsyncCommand<DesktopNameSettings> {
     : AsyncCommand<DesktopNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopNameSettings settings,
         DesktopNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/DesktopGetCommand.cs

@@ -9,7 +9,7 @@ namespace Shared.Rcl.Commands.Desktops;
 
 
 public class DesktopGetCommand(IServiceProvider provider)
 public class DesktopGetCommand(IServiceProvider provider)
     : AsyncCommand {
     : AsyncCommand {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {
         using IServiceScope scope = provider.CreateScope();
         using IServiceScope scope = provider.CreateScope();

+ 1 - 1
Shared.Rcl/Commands/Desktops/DesktopReportCommand.cs

@@ -13,7 +13,7 @@ public class DesktopReportCommand(
 ) : AsyncCommand {
 ) : AsyncCommand {
     private readonly ILogger<DesktopReportCommand> _logger = logger;
     private readonly ILogger<DesktopReportCommand> _logger = logger;
 
 
-    public override async Task<int> ExecuteAsync(CommandContext context, CancellationToken cancellationToken) {
+    protected override async Task<int> ExecuteAsync(CommandContext context, CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();
         DesktopHardwareReportUseCase useCase = scope.ServiceProvider.GetRequiredService<DesktopHardwareReportUseCase>();
         DesktopHardwareReportUseCase useCase = scope.ServiceProvider.GetRequiredService<DesktopHardwareReportUseCase>();
 
 

+ 1 - 1
Shared.Rcl/Commands/Desktops/DesktopSetCommand.cs

@@ -11,7 +11,7 @@ public class DesktopSetSettings : DesktopNameSettings {
 
 
 public class DesktopSetCommand(IServiceProvider provider)
 public class DesktopSetCommand(IServiceProvider provider)
     : AsyncCommand<DesktopSetSettings> {
     : AsyncCommand<DesktopSetSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopSetSettings settings,
         DesktopSetSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/DesktopTreeCommand.cs

@@ -7,7 +7,7 @@ namespace Shared.Rcl.Commands.Desktops;
 
 
 public sealed class DesktopTreeCommand(GetHardwareSystemTreeUseCase useCase)
 public sealed class DesktopTreeCommand(GetHardwareSystemTreeUseCase useCase)
     : AsyncCommand<DesktopNameSettings> {
     : AsyncCommand<DesktopNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopNameSettings settings,
         DesktopNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/Drive/DesktopDriveAddCommand.cs

@@ -23,7 +23,7 @@ public class DesktopDriveAddSettings : CommandSettings {
 
 
 public class DesktopDriveAddCommand(IServiceProvider provider)
 public class DesktopDriveAddCommand(IServiceProvider provider)
     : AsyncCommand<DesktopDriveAddSettings> {
     : AsyncCommand<DesktopDriveAddSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopDriveAddSettings settings,
         DesktopDriveAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/Drive/DesktopDriveRemoveCommand.cs

@@ -19,7 +19,7 @@ public class DesktopDriveRemoveSettings : CommandSettings {
 
 
 public class DesktopDriveRemoveCommand(IServiceProvider provider)
 public class DesktopDriveRemoveCommand(IServiceProvider provider)
     : AsyncCommand<DesktopDriveRemoveSettings> {
     : AsyncCommand<DesktopDriveRemoveSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopDriveRemoveSettings settings,
         DesktopDriveRemoveSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/Drive/DesktopDriveSetCommand.cs

@@ -27,7 +27,7 @@ public class DesktopDriveSetSettings : CommandSettings {
 
 
 public class DesktopDriveSetCommand(IServiceProvider provider)
 public class DesktopDriveSetCommand(IServiceProvider provider)
     : AsyncCommand<DesktopDriveSetSettings> {
     : AsyncCommand<DesktopDriveSetSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopDriveSetSettings settings,
         DesktopDriveSetSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/Gpus/DesktopGpuAddCommand.cs

@@ -23,7 +23,7 @@ public class DesktopGpuAddSettings : CommandSettings {
 
 
 public class DesktopGpuAddCommand(IServiceProvider provider)
 public class DesktopGpuAddCommand(IServiceProvider provider)
     : AsyncCommand<DesktopGpuAddSettings> {
     : AsyncCommand<DesktopGpuAddSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopGpuAddSettings settings,
         DesktopGpuAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/Gpus/DesktopGpuRemoveCommand.cs

@@ -19,7 +19,7 @@ public class DesktopGpuRemoveSettings : CommandSettings {
 
 
 public class DesktopGpuRemoveCommand(IServiceProvider provider)
 public class DesktopGpuRemoveCommand(IServiceProvider provider)
     : AsyncCommand<DesktopGpuRemoveSettings> {
     : AsyncCommand<DesktopGpuRemoveSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopGpuRemoveSettings settings,
         DesktopGpuRemoveSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/Gpus/DesktopGpuSetCommand.cs

@@ -27,7 +27,7 @@ public class DesktopGpuSetSettings : CommandSettings {
 
 
 public class DesktopGpuSetCommand(IServiceProvider provider)
 public class DesktopGpuSetCommand(IServiceProvider provider)
     : AsyncCommand<DesktopGpuSetSettings> {
     : AsyncCommand<DesktopGpuSetSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopGpuSetSettings settings,
         DesktopGpuSetSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/Labels/DesktopLabelAddCommand.cs

@@ -12,7 +12,7 @@ public class DesktopLabelAddSettings : DesktopNameSettings {
 }
 }
 
 
 public class DesktopLabelAddCommand(IServiceProvider serviceProvider) : AsyncCommand<DesktopLabelAddSettings> {
 public class DesktopLabelAddCommand(IServiceProvider serviceProvider) : AsyncCommand<DesktopLabelAddSettings> {
-    public override async Task<int> ExecuteAsync(CommandContext context, DesktopLabelAddSettings settings,
+    protected override async Task<int> ExecuteAsync(CommandContext context, DesktopLabelAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();
         IAddLabelUseCase<Desktop> useCase = scope.ServiceProvider.GetRequiredService<IAddLabelUseCase<Desktop>>();
         IAddLabelUseCase<Desktop> useCase = scope.ServiceProvider.GetRequiredService<IAddLabelUseCase<Desktop>>();

+ 1 - 1
Shared.Rcl/Commands/Desktops/Labels/DesktopLabelRemoveCommand.cs

@@ -11,7 +11,7 @@ public class DesktopLabelRemoveSettings : DesktopNameSettings {
 }
 }
 
 
 public class DesktopLabelRemoveCommand(IServiceProvider serviceProvider) : AsyncCommand<DesktopLabelRemoveSettings> {
 public class DesktopLabelRemoveCommand(IServiceProvider serviceProvider) : AsyncCommand<DesktopLabelRemoveSettings> {
-    public override async Task<int> ExecuteAsync(CommandContext context, DesktopLabelRemoveSettings settings,
+    protected override async Task<int> ExecuteAsync(CommandContext context, DesktopLabelRemoveSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();
         IRemoveLabelUseCase<Desktop> useCase = scope.ServiceProvider.GetRequiredService<IRemoveLabelUseCase<Desktop>>();
         IRemoveLabelUseCase<Desktop> useCase = scope.ServiceProvider.GetRequiredService<IRemoveLabelUseCase<Desktop>>();

+ 1 - 1
Shared.Rcl/Commands/Desktops/Nics/DesktopNicAddCommand.cs

@@ -27,7 +27,7 @@ public class DesktopNicAddSettings : CommandSettings {
 
 
 public class DesktopNicAddCommand(IServiceProvider provider)
 public class DesktopNicAddCommand(IServiceProvider provider)
     : AsyncCommand<DesktopNicAddSettings> {
     : AsyncCommand<DesktopNicAddSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopNicAddSettings settings,
         DesktopNicAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/Nics/DesktopNicRemoveCommand.cs

@@ -19,7 +19,7 @@ public class DesktopNicRemoveSettings : CommandSettings {
 
 
 public class DesktopNicRemoveCommand(IServiceProvider provider)
 public class DesktopNicRemoveCommand(IServiceProvider provider)
     : AsyncCommand<DesktopNicRemoveSettings> {
     : AsyncCommand<DesktopNicRemoveSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopNicRemoveSettings settings,
         DesktopNicRemoveSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/Nics/DesktopNicSetCommand.cs

@@ -31,7 +31,7 @@ public class DesktopNicSetSettings : CommandSettings {
 
 
 public class DesktopNicSetCommand(IServiceProvider provider)
 public class DesktopNicSetCommand(IServiceProvider provider)
     : AsyncCommand<DesktopNicSetSettings> {
     : AsyncCommand<DesktopNicSetSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopNicSetSettings settings,
         DesktopNicSetSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Desktops/Rename/DesktopRenameCommand.cs

@@ -14,7 +14,7 @@ public class DesktopRenameSettings : DesktopNameSettings {
 public class DesktopRenameCommand(
 public class DesktopRenameCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<DesktopRenameSettings> {
 ) : AsyncCommand<DesktopRenameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         DesktopRenameSettings settings,
         DesktopRenameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Exporters/GenerateAnsibleInventoryCommand.cs

@@ -31,7 +31,7 @@ public sealed class GenerateAnsibleInventorySettings : CommandSettings {
 
 
 public sealed class GenerateAnsibleInventoryCommand(IServiceProvider provider)
 public sealed class GenerateAnsibleInventoryCommand(IServiceProvider provider)
     : AsyncCommand<GenerateAnsibleInventorySettings> {
     : AsyncCommand<GenerateAnsibleInventorySettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         GenerateAnsibleInventorySettings settings,
         GenerateAnsibleInventorySettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Exporters/GenerateHostsFileCommand.cs

@@ -7,7 +7,7 @@ namespace Shared.Rcl.Commands.Exporters;
 
 
 public sealed class GenerateHostsFileCommand(IServiceProvider provider)
 public sealed class GenerateHostsFileCommand(IServiceProvider provider)
     : AsyncCommand<GenerateHostsFileSettings> {
     : AsyncCommand<GenerateHostsFileSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         GenerateHostsFileSettings settings,
         GenerateHostsFileSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Exporters/GenerateSshConfigCommand.cs

@@ -7,7 +7,7 @@ namespace Shared.Rcl.Commands.Exporters;
 
 
 public sealed class GenerateSshConfigCommand(IServiceProvider provider)
 public sealed class GenerateSshConfigCommand(IServiceProvider provider)
     : AsyncCommand<GenerateSshConfigSettings> {
     : AsyncCommand<GenerateSshConfigSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         GenerateSshConfigSettings settings,
         GenerateSshConfigSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Firewalls/FirewallAddCommand.cs

@@ -13,7 +13,7 @@ public class FirewallAddSettings : CommandSettings {
 public class FirewallAddCommand(
 public class FirewallAddCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<FirewallAddSettings> {
 ) : AsyncCommand<FirewallAddSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         FirewallAddSettings settings,
         FirewallAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Firewalls/FirewallDeleteCommand.cs

@@ -9,7 +9,7 @@ namespace Shared.Rcl.Commands.Firewalls;
 public class FirewallDeleteCommand(
 public class FirewallDeleteCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<FirewallNameSettings> {
 ) : AsyncCommand<FirewallNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         FirewallNameSettings settings,
         FirewallNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Firewalls/FirewallDescribeCommand.cs

@@ -9,7 +9,7 @@ namespace Shared.Rcl.Commands.Firewalls;
 public class FirewallDescribeCommand(
 public class FirewallDescribeCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<FirewallNameSettings> {
 ) : AsyncCommand<FirewallNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         FirewallNameSettings settings,
         FirewallNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Firewalls/FirewallGetByNameCommand.cs

@@ -8,7 +8,7 @@ namespace Shared.Rcl.Commands.Firewalls;
 public class FirewallGetByNameCommand(
 public class FirewallGetByNameCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<FirewallNameSettings> {
 ) : AsyncCommand<FirewallNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         FirewallNameSettings settings,
         FirewallNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Firewalls/FirewallGetCommand.cs

@@ -9,7 +9,7 @@ namespace Shared.Rcl.Commands.Firewalls;
 public class FirewallGetCommand(
 public class FirewallGetCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand {
 ) : AsyncCommand {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();

+ 1 - 1
Shared.Rcl/Commands/Firewalls/FirewallReportCommand.cs

@@ -9,7 +9,7 @@ namespace Shared.Rcl.Commands.Firewalls;
 public class FirewallReportCommand(
 public class FirewallReportCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand {
 ) : AsyncCommand {
-    public override async Task<int> ExecuteAsync(CommandContext context, CancellationToken cancellationToken) {
+    protected override async Task<int> ExecuteAsync(CommandContext context, CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();
         FirewallHardwareReportUseCase useCase =
         FirewallHardwareReportUseCase useCase =
             scope.ServiceProvider.GetRequiredService<FirewallHardwareReportUseCase>();
             scope.ServiceProvider.GetRequiredService<FirewallHardwareReportUseCase>();

+ 1 - 1
Shared.Rcl/Commands/Firewalls/FirewallSetCommand.cs

@@ -17,7 +17,7 @@ public class FirewallSetSettings : ServerNameSettings {
 public class FirewallSetCommand(
 public class FirewallSetCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<FirewallSetSettings> {
 ) : AsyncCommand<FirewallSetSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         FirewallSetSettings settings,
         FirewallSetSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Firewalls/Labels/FirewallLabelAddCommand.cs

@@ -12,7 +12,7 @@ public class FirewallLabelAddSettings : FirewallNameSettings {
 }
 }
 
 
 public class FirewallLabelAddCommand(IServiceProvider serviceProvider) : AsyncCommand<FirewallLabelAddSettings> {
 public class FirewallLabelAddCommand(IServiceProvider serviceProvider) : AsyncCommand<FirewallLabelAddSettings> {
-    public override async Task<int> ExecuteAsync(CommandContext context, FirewallLabelAddSettings settings,
+    protected override async Task<int> ExecuteAsync(CommandContext context, FirewallLabelAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();
         IAddLabelUseCase<Firewall> useCase = scope.ServiceProvider.GetRequiredService<IAddLabelUseCase<Firewall>>();
         IAddLabelUseCase<Firewall> useCase = scope.ServiceProvider.GetRequiredService<IAddLabelUseCase<Firewall>>();

+ 1 - 1
Shared.Rcl/Commands/Firewalls/Labels/FirewallLabelRemoveCommand.cs

@@ -11,7 +11,7 @@ public class FirewallLabelRemoveSettings : FirewallNameSettings {
 }
 }
 
 
 public class FirewallLabelRemoveCommand(IServiceProvider serviceProvider) : AsyncCommand<FirewallLabelRemoveSettings> {
 public class FirewallLabelRemoveCommand(IServiceProvider serviceProvider) : AsyncCommand<FirewallLabelRemoveSettings> {
-    public override async Task<int> ExecuteAsync(CommandContext context, FirewallLabelRemoveSettings settings,
+    protected override async Task<int> ExecuteAsync(CommandContext context, FirewallLabelRemoveSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();
         IRemoveLabelUseCase<Firewall> useCase =
         IRemoveLabelUseCase<Firewall> useCase =

+ 1 - 1
Shared.Rcl/Commands/Firewalls/Ports/FirewallPortAddCommand.cs

@@ -14,7 +14,7 @@ public class FirewallPortAddSettings : FirewallNameSettings {
 
 
 public class FirewallPortAddCommand(IServiceProvider sp)
 public class FirewallPortAddCommand(IServiceProvider sp)
     : AsyncCommand<FirewallPortAddSettings> {
     : AsyncCommand<FirewallPortAddSettings> {
-    public override async Task<int> ExecuteAsync(CommandContext ctx, FirewallPortAddSettings s, CancellationToken ct) {
+    protected override async Task<int> ExecuteAsync(CommandContext ctx, FirewallPortAddSettings s, CancellationToken ct) {
         using IServiceScope scope = sp.CreateScope();
         using IServiceScope scope = sp.CreateScope();
         IAddPortUseCase<Firewall> useCase = scope.ServiceProvider.GetRequiredService<IAddPortUseCase<Firewall>>();
         IAddPortUseCase<Firewall> useCase = scope.ServiceProvider.GetRequiredService<IAddPortUseCase<Firewall>>();
 
 

+ 1 - 1
Shared.Rcl/Commands/Firewalls/Ports/FirewallPortRemoveCommand.cs

@@ -12,7 +12,7 @@ public class FirewallPortRemoveSettings : FirewallNameSettings {
 
 
 public class FirewallPortRemoveCommand(IServiceProvider sp)
 public class FirewallPortRemoveCommand(IServiceProvider sp)
     : AsyncCommand<FirewallPortRemoveSettings> {
     : AsyncCommand<FirewallPortRemoveSettings> {
-    public override async Task<int> ExecuteAsync(CommandContext ctx, FirewallPortRemoveSettings s, CancellationToken ct) {
+    protected override async Task<int> ExecuteAsync(CommandContext ctx, FirewallPortRemoveSettings s, CancellationToken ct) {
         using IServiceScope scope = sp.CreateScope();
         using IServiceScope scope = sp.CreateScope();
         IRemovePortUseCase<Firewall> useCase = scope.ServiceProvider.GetRequiredService<IRemovePortUseCase<Firewall>>();
         IRemovePortUseCase<Firewall> useCase = scope.ServiceProvider.GetRequiredService<IRemovePortUseCase<Firewall>>();
 
 

+ 1 - 1
Shared.Rcl/Commands/Firewalls/Ports/FirewallPortUpdateCommand.cs

@@ -15,7 +15,7 @@ public class FirewallPortUpdateSettings : FirewallNameSettings {
 
 
 public class FirewallPortUpdateCommand(IServiceProvider sp)
 public class FirewallPortUpdateCommand(IServiceProvider sp)
     : AsyncCommand<FirewallPortUpdateSettings> {
     : AsyncCommand<FirewallPortUpdateSettings> {
-    public override async Task<int> ExecuteAsync(CommandContext ctx, FirewallPortUpdateSettings s, CancellationToken ct) {
+    protected override async Task<int> ExecuteAsync(CommandContext ctx, FirewallPortUpdateSettings s, CancellationToken ct) {
         using IServiceScope scope = sp.CreateScope();
         using IServiceScope scope = sp.CreateScope();
         IUpdatePortUseCase<Firewall> useCase = scope.ServiceProvider.GetRequiredService<IUpdatePortUseCase<Firewall>>();
         IUpdatePortUseCase<Firewall> useCase = scope.ServiceProvider.GetRequiredService<IUpdatePortUseCase<Firewall>>();
 
 

+ 1 - 1
Shared.Rcl/Commands/Firewalls/Rename/FirewallRenameCommand.cs

@@ -14,7 +14,7 @@ public class FirewallRenameSettings : FirewallNameSettings {
 public class FirewallRenameCommand(
 public class FirewallRenameCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<FirewallRenameSettings> {
 ) : AsyncCommand<FirewallRenameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         FirewallRenameSettings settings,
         FirewallRenameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/GetTotalSummaryCommand.cs

@@ -9,7 +9,7 @@ using Spectre.Console.Cli;
 namespace Shared.Rcl.Commands;
 namespace Shared.Rcl.Commands;
 
 
 public class GetTotalSummaryCommand(IServiceProvider provider) : AsyncCommand {
 public class GetTotalSummaryCommand(IServiceProvider provider) : AsyncCommand {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {
         using IServiceScope scope = provider.CreateScope();
         using IServiceScope scope = provider.CreateScope();

+ 1 - 1
Shared.Rcl/Commands/Laptops/Cpus/LaptopCpuAddCommand.cs

@@ -27,7 +27,7 @@ public class LaptopCpuAddSettings : CommandSettings {
 
 
 public class LaptopCpuAddCommand(IServiceProvider provider)
 public class LaptopCpuAddCommand(IServiceProvider provider)
     : AsyncCommand<LaptopCpuAddSettings> {
     : AsyncCommand<LaptopCpuAddSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         LaptopCpuAddSettings settings,
         LaptopCpuAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Laptops/Cpus/LaptopCpuRemoveCommand.cs

@@ -19,7 +19,7 @@ public class LaptopCpuRemoveSettings : CommandSettings {
 
 
 public class LaptopCpuRemoveCommand(IServiceProvider provider)
 public class LaptopCpuRemoveCommand(IServiceProvider provider)
     : AsyncCommand<LaptopCpuRemoveSettings> {
     : AsyncCommand<LaptopCpuRemoveSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         LaptopCpuRemoveSettings settings,
         LaptopCpuRemoveSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Laptops/Cpus/LaptopCpuSetCommand.cs

@@ -31,7 +31,7 @@ public class LaptopCpuSetSettings : CommandSettings {
 
 
 public class LaptopCpuSetCommand(IServiceProvider provider)
 public class LaptopCpuSetCommand(IServiceProvider provider)
     : AsyncCommand<LaptopCpuSetSettings> {
     : AsyncCommand<LaptopCpuSetSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         LaptopCpuSetSettings settings,
         LaptopCpuSetSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Laptops/Drive/LaptopDriveAddCommand.cs

@@ -8,7 +8,7 @@ namespace Shared.Rcl.Commands.Laptops.Drive;
 
 
 public class LaptopDriveAddCommand(IServiceProvider provider)
 public class LaptopDriveAddCommand(IServiceProvider provider)
     : AsyncCommand<LaptopDriveAddSettings> {
     : AsyncCommand<LaptopDriveAddSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         LaptopDriveAddSettings settings,
         LaptopDriveAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Laptops/Drive/LaptopDriveRemoveCommand.cs

@@ -8,7 +8,7 @@ namespace Shared.Rcl.Commands.Laptops.Drive;
 
 
 public class LaptopDriveRemoveCommand(IServiceProvider provider)
 public class LaptopDriveRemoveCommand(IServiceProvider provider)
     : AsyncCommand<LaptopDriveRemoveSettings> {
     : AsyncCommand<LaptopDriveRemoveSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         LaptopDriveRemoveSettings settings,
         LaptopDriveRemoveSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Laptops/Drive/LaptopDriveSetCommand.cs

@@ -8,7 +8,7 @@ namespace Shared.Rcl.Commands.Laptops.Drive;
 
 
 public class LaptopDriveSetCommand(IServiceProvider provider)
 public class LaptopDriveSetCommand(IServiceProvider provider)
     : AsyncCommand<LaptopDriveSetSettings> {
     : AsyncCommand<LaptopDriveSetSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         LaptopDriveSetSettings settings,
         LaptopDriveSetSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Laptops/Gpus/LaptopGpuAddCommand.cs

@@ -8,7 +8,7 @@ namespace Shared.Rcl.Commands.Laptops.Gpus;
 
 
 public class LaptopGpuAddCommand(IServiceProvider provider)
 public class LaptopGpuAddCommand(IServiceProvider provider)
     : AsyncCommand<LaptopGpuAddSettings> {
     : AsyncCommand<LaptopGpuAddSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         LaptopGpuAddSettings settings,
         LaptopGpuAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Laptops/Gpus/LaptopGpuRemoveCommand.cs

@@ -8,7 +8,7 @@ namespace Shared.Rcl.Commands.Laptops.Gpus;
 
 
 public class LaptopGpuRemoveCommand(IServiceProvider provider)
 public class LaptopGpuRemoveCommand(IServiceProvider provider)
     : AsyncCommand<LaptopGpuRemoveSettings> {
     : AsyncCommand<LaptopGpuRemoveSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         LaptopGpuRemoveSettings settings,
         LaptopGpuRemoveSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Laptops/Gpus/LaptopGpuSetCommand.cs

@@ -9,7 +9,7 @@ namespace Shared.Rcl.Commands.Laptops.Gpus;
 
 
 public class LaptopGpuSetCommand(IServiceProvider provider)
 public class LaptopGpuSetCommand(IServiceProvider provider)
     : AsyncCommand<LaptopGpuSetSettings> {
     : AsyncCommand<LaptopGpuSetSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         LaptopGpuSetSettings settings,
         LaptopGpuSetSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Laptops/Labels/LaptopLabelAddCommand.cs

@@ -12,7 +12,7 @@ public class LaptopLabelAddSettings : LaptopNameSettings {
 }
 }
 
 
 public class LaptopLabelAddCommand(IServiceProvider serviceProvider) : AsyncCommand<LaptopLabelAddSettings> {
 public class LaptopLabelAddCommand(IServiceProvider serviceProvider) : AsyncCommand<LaptopLabelAddSettings> {
-    public override async Task<int> ExecuteAsync(CommandContext context, LaptopLabelAddSettings settings,
+    protected override async Task<int> ExecuteAsync(CommandContext context, LaptopLabelAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();
         IAddLabelUseCase<Laptop> useCase = scope.ServiceProvider.GetRequiredService<IAddLabelUseCase<Laptop>>();
         IAddLabelUseCase<Laptop> useCase = scope.ServiceProvider.GetRequiredService<IAddLabelUseCase<Laptop>>();

+ 1 - 1
Shared.Rcl/Commands/Laptops/Labels/LaptopLabelRemoveCommand.cs

@@ -11,7 +11,7 @@ public class LaptopLabelRemoveSettings : LaptopNameSettings {
 }
 }
 
 
 public class LaptopLabelRemoveCommand(IServiceProvider serviceProvider) : AsyncCommand<LaptopLabelRemoveSettings> {
 public class LaptopLabelRemoveCommand(IServiceProvider serviceProvider) : AsyncCommand<LaptopLabelRemoveSettings> {
-    public override async Task<int> ExecuteAsync(CommandContext context, LaptopLabelRemoveSettings settings,
+    protected override async Task<int> ExecuteAsync(CommandContext context, LaptopLabelRemoveSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();
         IRemoveLabelUseCase<Laptop> useCase = scope.ServiceProvider.GetRequiredService<IRemoveLabelUseCase<Laptop>>();
         IRemoveLabelUseCase<Laptop> useCase = scope.ServiceProvider.GetRequiredService<IRemoveLabelUseCase<Laptop>>();

+ 1 - 1
Shared.Rcl/Commands/Laptops/LaptopAddCommand.cs

@@ -8,7 +8,7 @@ namespace Shared.Rcl.Commands.Laptops;
 
 
 public class LaptopAddCommand(IServiceProvider provider)
 public class LaptopAddCommand(IServiceProvider provider)
     : AsyncCommand<LaptopNameSettings> {
     : AsyncCommand<LaptopNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         LaptopNameSettings settings,
         LaptopNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Laptops/LaptopDeleteCommand.cs

@@ -8,7 +8,7 @@ namespace Shared.Rcl.Commands.Laptops;
 
 
 public class LaptopDeleteCommand(IServiceProvider provider)
 public class LaptopDeleteCommand(IServiceProvider provider)
     : AsyncCommand<LaptopNameSettings> {
     : AsyncCommand<LaptopNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         LaptopNameSettings settings,
         LaptopNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Laptops/LaptopDescribeCommand.cs

@@ -7,7 +7,7 @@ namespace Shared.Rcl.Commands.Laptops;
 
 
 public class LaptopDescribeCommand(IServiceProvider provider)
 public class LaptopDescribeCommand(IServiceProvider provider)
     : AsyncCommand<LaptopNameSettings> {
     : AsyncCommand<LaptopNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         LaptopNameSettings settings,
         LaptopNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Laptops/LaptopGetByNameCommand.cs

@@ -8,7 +8,7 @@ namespace Shared.Rcl.Commands.Laptops;
 
 
 public class LaptopGetByNameCommand(IServiceProvider provider)
 public class LaptopGetByNameCommand(IServiceProvider provider)
     : AsyncCommand<LaptopNameSettings> {
     : AsyncCommand<LaptopNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         LaptopNameSettings settings,
         LaptopNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Laptops/LaptopGetCommand.cs

@@ -9,7 +9,7 @@ namespace Shared.Rcl.Commands.Laptops;
 
 
 public class LaptopGetCommand(IServiceProvider provider)
 public class LaptopGetCommand(IServiceProvider provider)
     : AsyncCommand {
     : AsyncCommand {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {
         using IServiceScope scope = provider.CreateScope();
         using IServiceScope scope = provider.CreateScope();

+ 1 - 1
Shared.Rcl/Commands/Laptops/LaptopReportCommand.cs

@@ -9,7 +9,7 @@ namespace Shared.Rcl.Commands.Laptops;
 public class LaptopReportCommand(
 public class LaptopReportCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand {
 ) : AsyncCommand {
-    public override async Task<int> ExecuteAsync(CommandContext context, CancellationToken cancellationToken) {
+    protected override async Task<int> ExecuteAsync(CommandContext context, CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();
         LaptopHardwareReportUseCase useCase = scope.ServiceProvider.GetRequiredService<LaptopHardwareReportUseCase>();
         LaptopHardwareReportUseCase useCase = scope.ServiceProvider.GetRequiredService<LaptopHardwareReportUseCase>();
 
 

+ 1 - 1
Shared.Rcl/Commands/Laptops/LaptopSetCommand.cs

@@ -11,7 +11,7 @@ public class LaptopSetSettings : LaptopNameSettings {
 
 
 public class LaptopSetCommand(IServiceProvider provider)
 public class LaptopSetCommand(IServiceProvider provider)
     : AsyncCommand<LaptopSetSettings> {
     : AsyncCommand<LaptopSetSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         LaptopSetSettings settings,
         LaptopSetSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Laptops/LaptopTreeCommand.cs

@@ -7,7 +7,7 @@ namespace Shared.Rcl.Commands.Laptops;
 
 
 public sealed class LaptopTreeCommand(GetHardwareSystemTreeUseCase useCase)
 public sealed class LaptopTreeCommand(GetHardwareSystemTreeUseCase useCase)
     : AsyncCommand<LaptopNameSettings> {
     : AsyncCommand<LaptopNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         LaptopNameSettings settings,
         LaptopNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Laptops/Rename/LaptopRenameCommand.cs

@@ -14,7 +14,7 @@ public class LaptopRenameSettings : LaptopNameSettings {
 public class LaptopRenameCommand(
 public class LaptopRenameCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<LaptopRenameSettings> {
 ) : AsyncCommand<LaptopRenameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         LaptopRenameSettings settings,
         LaptopRenameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Routers/Labels/RouterLabelAddCommand.cs

@@ -12,7 +12,7 @@ public class RouterLabelAddSettings : RouterNameSettings {
 }
 }
 
 
 public class RouterLabelAddCommand(IServiceProvider serviceProvider) : AsyncCommand<RouterLabelAddSettings> {
 public class RouterLabelAddCommand(IServiceProvider serviceProvider) : AsyncCommand<RouterLabelAddSettings> {
-    public override async Task<int> ExecuteAsync(CommandContext context, RouterLabelAddSettings settings,
+    protected override async Task<int> ExecuteAsync(CommandContext context, RouterLabelAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();
         IAddLabelUseCase<Router> useCase = scope.ServiceProvider.GetRequiredService<IAddLabelUseCase<Router>>();
         IAddLabelUseCase<Router> useCase = scope.ServiceProvider.GetRequiredService<IAddLabelUseCase<Router>>();

+ 1 - 1
Shared.Rcl/Commands/Routers/Labels/RouterLabelRemoveCommand.cs

@@ -11,7 +11,7 @@ public class RouterLabelRemoveSettings : RouterNameSettings {
 }
 }
 
 
 public class RouterLabelRemoveCommand(IServiceProvider serviceProvider) : AsyncCommand<RouterLabelRemoveSettings> {
 public class RouterLabelRemoveCommand(IServiceProvider serviceProvider) : AsyncCommand<RouterLabelRemoveSettings> {
-    public override async Task<int> ExecuteAsync(CommandContext context, RouterLabelRemoveSettings settings,
+    protected override async Task<int> ExecuteAsync(CommandContext context, RouterLabelRemoveSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();
         IRemoveLabelUseCase<Router> useCase = scope.ServiceProvider.GetRequiredService<IRemoveLabelUseCase<Router>>();
         IRemoveLabelUseCase<Router> useCase = scope.ServiceProvider.GetRequiredService<IRemoveLabelUseCase<Router>>();

+ 1 - 1
Shared.Rcl/Commands/Routers/Ports/RouterPortAddCommand.cs

@@ -14,7 +14,7 @@ public class RouterPortAddSettings : RouterNameSettings {
 
 
 public class RouterPortAddCommand(IServiceProvider sp)
 public class RouterPortAddCommand(IServiceProvider sp)
     : AsyncCommand<RouterPortAddSettings> {
     : AsyncCommand<RouterPortAddSettings> {
-    public override async Task<int> ExecuteAsync(CommandContext ctx, RouterPortAddSettings s, CancellationToken ct) {
+    protected override async Task<int> ExecuteAsync(CommandContext ctx, RouterPortAddSettings s, CancellationToken ct) {
         using IServiceScope scope = sp.CreateScope();
         using IServiceScope scope = sp.CreateScope();
         IAddPortUseCase<Router> useCase = scope.ServiceProvider.GetRequiredService<IAddPortUseCase<Router>>();
         IAddPortUseCase<Router> useCase = scope.ServiceProvider.GetRequiredService<IAddPortUseCase<Router>>();
 
 

+ 1 - 1
Shared.Rcl/Commands/Routers/Ports/RouterPortRemoveCommand.cs

@@ -12,7 +12,7 @@ public class RouterPortRemoveSettings : RouterNameSettings {
 
 
 public class RouterPortRemoveCommand(IServiceProvider sp)
 public class RouterPortRemoveCommand(IServiceProvider sp)
     : AsyncCommand<RouterPortRemoveSettings> {
     : AsyncCommand<RouterPortRemoveSettings> {
-    public override async Task<int> ExecuteAsync(CommandContext ctx, RouterPortRemoveSettings s, CancellationToken ct) {
+    protected override async Task<int> ExecuteAsync(CommandContext ctx, RouterPortRemoveSettings s, CancellationToken ct) {
         using IServiceScope scope = sp.CreateScope();
         using IServiceScope scope = sp.CreateScope();
         IRemovePortUseCase<Router> useCase = scope.ServiceProvider.GetRequiredService<IRemovePortUseCase<Router>>();
         IRemovePortUseCase<Router> useCase = scope.ServiceProvider.GetRequiredService<IRemovePortUseCase<Router>>();
 
 

+ 1 - 1
Shared.Rcl/Commands/Routers/Ports/RouterPortUpdateCommand.cs

@@ -15,7 +15,7 @@ public class RouterPortUpdateSettings : RouterNameSettings {
 
 
 public class RouterPortUpdateCommand(IServiceProvider sp)
 public class RouterPortUpdateCommand(IServiceProvider sp)
     : AsyncCommand<RouterPortUpdateSettings> {
     : AsyncCommand<RouterPortUpdateSettings> {
-    public override async Task<int> ExecuteAsync(CommandContext ctx, RouterPortUpdateSettings s, CancellationToken ct) {
+    protected override async Task<int> ExecuteAsync(CommandContext ctx, RouterPortUpdateSettings s, CancellationToken ct) {
         using IServiceScope scope = sp.CreateScope();
         using IServiceScope scope = sp.CreateScope();
         IUpdatePortUseCase<Router> useCase = scope.ServiceProvider.GetRequiredService<IUpdatePortUseCase<Router>>();
         IUpdatePortUseCase<Router> useCase = scope.ServiceProvider.GetRequiredService<IUpdatePortUseCase<Router>>();
 
 

+ 1 - 1
Shared.Rcl/Commands/Routers/Rename/RouterRenameCommand.cs

@@ -14,7 +14,7 @@ public class RouterRenameSettings : RouterNameSettings {
 public class RouterRenameCommand(
 public class RouterRenameCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<RouterRenameSettings> {
 ) : AsyncCommand<RouterRenameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         RouterRenameSettings settings,
         RouterRenameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Routers/RouterAddCommand.cs

@@ -13,7 +13,7 @@ public class RouterAddSettings : CommandSettings {
 public class RouterAddCommand(
 public class RouterAddCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<RouterAddSettings> {
 ) : AsyncCommand<RouterAddSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         RouterAddSettings settings,
         RouterAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Routers/RouterDeleteCommand.cs

@@ -9,7 +9,7 @@ namespace Shared.Rcl.Commands.Routers;
 public class RouterDeleteCommand(
 public class RouterDeleteCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<RouterNameSettings> {
 ) : AsyncCommand<RouterNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         RouterNameSettings settings,
         RouterNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Routers/RouterDescribeCommand.cs

@@ -8,7 +8,7 @@ namespace Shared.Rcl.Commands.Routers;
 public class RouterDescribeCommand(
 public class RouterDescribeCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<RouterNameSettings> {
 ) : AsyncCommand<RouterNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         RouterNameSettings settings,
         RouterNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Routers/RouterGetByNameCommand.cs

@@ -8,7 +8,7 @@ namespace Shared.Rcl.Commands.Routers;
 public class RouterGetByNameCommand(
 public class RouterGetByNameCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<RouterNameSettings> {
 ) : AsyncCommand<RouterNameSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         RouterNameSettings settings,
         RouterNameSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Routers/RouterGetCommand.cs

@@ -9,7 +9,7 @@ namespace Shared.Rcl.Commands.Routers;
 public class RouterGetCommand(
 public class RouterGetCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand {
 ) : AsyncCommand {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();

+ 1 - 1
Shared.Rcl/Commands/Routers/RouterReportCommand.cs

@@ -9,7 +9,7 @@ namespace Shared.Rcl.Commands.Routers;
 public class RouterReportCommand(
 public class RouterReportCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand {
 ) : AsyncCommand {
-    public override async Task<int> ExecuteAsync(CommandContext context, CancellationToken cancellationToken) {
+    protected override async Task<int> ExecuteAsync(CommandContext context, CancellationToken cancellationToken) {
         using IServiceScope scope = serviceProvider.CreateScope();
         using IServiceScope scope = serviceProvider.CreateScope();
         RouterHardwareReportUseCase useCase = scope.ServiceProvider.GetRequiredService<RouterHardwareReportUseCase>();
         RouterHardwareReportUseCase useCase = scope.ServiceProvider.GetRequiredService<RouterHardwareReportUseCase>();
 
 

+ 1 - 1
Shared.Rcl/Commands/Routers/RouterSetCommand.cs

@@ -17,7 +17,7 @@ public class RouterSetSettings : ServerNameSettings {
 public class RouterSetCommand(
 public class RouterSetCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<RouterSetSettings> {
 ) : AsyncCommand<RouterSetSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         RouterSetSettings settings,
         RouterSetSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Servers/Cpus/ServerCpuAddCommand.cs

@@ -17,7 +17,7 @@ public class ServerCpuAddSettings : ServerNameSettings {
 public class ServerCpuAddCommand(
 public class ServerCpuAddCommand(
     IServiceProvider serviceProvider
     IServiceProvider serviceProvider
 ) : AsyncCommand<ServerCpuAddSettings> {
 ) : AsyncCommand<ServerCpuAddSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         ServerCpuAddSettings settings,
         ServerCpuAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Servers/Cpus/ServerCpuRemoveCommand.cs

@@ -11,7 +11,7 @@ public class ServerCpuRemoveSettings : ServerNameSettings {
 }
 }
 
 
 public class ServerCpuRemoveCommand(IServiceProvider serviceProvider) : AsyncCommand<ServerCpuRemoveSettings> {
 public class ServerCpuRemoveCommand(IServiceProvider serviceProvider) : AsyncCommand<ServerCpuRemoveSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         ServerCpuRemoveSettings settings,
         ServerCpuRemoveSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Servers/Cpus/ServerCpuSetCommand.cs

@@ -17,7 +17,7 @@ public class ServerCpuSetSettings : ServerNameSettings {
 }
 }
 
 
 public class ServerCpuSetCommand(IServiceProvider serviceProvider) : AsyncCommand<ServerCpuSetSettings> {
 public class ServerCpuSetCommand(IServiceProvider serviceProvider) : AsyncCommand<ServerCpuSetSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         ServerCpuSetSettings settings,
         ServerCpuSetSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Servers/Drives/ServerDriveAddCommand.cs

@@ -19,7 +19,7 @@ public class ServerDriveAddSettings : ServerNameSettings {
 
 
 public class ServerDriveAddCommand(IServiceProvider serviceProvider)
 public class ServerDriveAddCommand(IServiceProvider serviceProvider)
     : AsyncCommand<ServerDriveAddSettings> {
     : AsyncCommand<ServerDriveAddSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         ServerDriveAddSettings settings,
         ServerDriveAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Servers/Drives/ServerDriveRemoveCommand.cs

@@ -12,7 +12,7 @@ public class ServerDriveRemoveSettings : ServerNameSettings {
 
 
 public class ServerDriveRemoveCommand(IServiceProvider serviceProvider)
 public class ServerDriveRemoveCommand(IServiceProvider serviceProvider)
     : AsyncCommand<ServerDriveRemoveSettings> {
     : AsyncCommand<ServerDriveRemoveSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         ServerDriveRemoveSettings settings,
         ServerDriveRemoveSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Servers/Drives/ServerDriveUpdateCommand.cs

@@ -16,7 +16,7 @@ public class ServerDriveUpdateSettings : ServerNameSettings {
 
 
 public class ServerDriveUpdateCommand(IServiceProvider serviceProvider)
 public class ServerDriveUpdateCommand(IServiceProvider serviceProvider)
     : AsyncCommand<ServerDriveUpdateSettings> {
     : AsyncCommand<ServerDriveUpdateSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         ServerDriveUpdateSettings settings,
         ServerDriveUpdateSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Servers/Gpus/AddGpuUseCaseCommand.cs

@@ -14,7 +14,7 @@ public class ServerGpuAddSettings : ServerNameSettings {
 
 
 public class ServerGpuAddCommand(IServiceProvider serviceProvider)
 public class ServerGpuAddCommand(IServiceProvider serviceProvider)
     : AsyncCommand<ServerGpuAddSettings> {
     : AsyncCommand<ServerGpuAddSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         ServerGpuAddSettings settings,
         ServerGpuAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Servers/Gpus/RemoveGpuUseCaseCommand.cs

@@ -12,7 +12,7 @@ public class ServerGpuRemoveSettings : ServerNameSettings {
 
 
 public class ServerGpuRemoveCommand(IServiceProvider serviceProvider)
 public class ServerGpuRemoveCommand(IServiceProvider serviceProvider)
     : AsyncCommand<ServerGpuRemoveSettings> {
     : AsyncCommand<ServerGpuRemoveSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         ServerGpuRemoveSettings settings,
         ServerGpuRemoveSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Servers/Gpus/UpdateGpuUseCaseCommand.cs

@@ -16,7 +16,7 @@ public class ServerGpuUpdateSettings : ServerNameSettings {
 
 
 public class ServerGpuUpdateCommand(IServiceProvider serviceProvider)
 public class ServerGpuUpdateCommand(IServiceProvider serviceProvider)
     : AsyncCommand<ServerGpuUpdateSettings> {
     : AsyncCommand<ServerGpuUpdateSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         ServerGpuUpdateSettings settings,
         ServerGpuUpdateSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Servers/Labels/ServerLabelAddCommand.cs

@@ -14,7 +14,7 @@ public class ServerLabelAddSettings : ServerNameSettings {
 
 
 public class ServerLabelAddCommand(IServiceProvider serviceProvider)
 public class ServerLabelAddCommand(IServiceProvider serviceProvider)
     : AsyncCommand<ServerLabelAddSettings> {
     : AsyncCommand<ServerLabelAddSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         ServerLabelAddSettings settings,
         ServerLabelAddSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

+ 1 - 1
Shared.Rcl/Commands/Servers/Labels/ServerLabelRemoveCommand.cs

@@ -12,7 +12,7 @@ public class ServerLabelRemoveSettings : ServerNameSettings {
 
 
 public class ServerLabelRemoveCommand(IServiceProvider serviceProvider)
 public class ServerLabelRemoveCommand(IServiceProvider serviceProvider)
     : AsyncCommand<ServerLabelRemoveSettings> {
     : AsyncCommand<ServerLabelRemoveSettings> {
-    public override async Task<int> ExecuteAsync(
+    protected override async Task<int> ExecuteAsync(
         CommandContext context,
         CommandContext context,
         ServerLabelRemoveSettings settings,
         ServerLabelRemoveSettings settings,
         CancellationToken cancellationToken) {
         CancellationToken cancellationToken) {

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio