{"owner":"lostindark","repo":"DriverStoreExplorer","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md"],"skills":{"AGENTS.md":"# Copilot Instructions for DriverStoreExplorer\n\n## Build & Test\n\nThis is a .NET Framework 4.7.2 Windows Forms application. Use **MSBuild** (not `dotnet build`).\n\n```powershell\n# Restore + Build\nnuget restore Rapr.sln\nmsbuild Rapr.sln /p:Configuration=Release /p:Platform=\"Any CPU\" /v:minimal\n\n# Run all tests (MSTest)\ndotnet test RaprTests\\RaprTests.csproj\n\n# Run a single test\ndotnet test RaprTests\\RaprTests.csproj --filter \"FullyQualifiedName~TestMethodName\"\n```\n\nThe CI workflow (`.github/workflows/ci.yml`) builds with MSBuild on `windows-latest`. There is no separate lint step — code analysis is handled by the `Microsoft.CodeAnalysis.NetAnalyzers` NuGet package at build time.\n\n## Architecture\n\n**Driver store abstraction:** The core pattern is `IDriverStore` (in `Rapr/Utils/`), which defines operations for enumerating, adding, deleting, and exporting driver packages. Three implementations exist:\n\n- `NativeDriverStore` — Windows native API via P/Invoke (`SetupAPI.cs`, `SafeNativeMethods.cs`)\n- `DismUtil` — DISM API via `Microsoft.Dism` NuGet package\n- `PnpUtil` — Parses `pnputil.exe` command output\n\n`DriverStoreFactory` creates the appropriate implementation based on user settings with automatic fallback based on OS capabilities. Each backend supports both online (local machine) and offline (mounted image) driver stores.\n\n**Main form split:** The main UI is split across `DSEForm.cs` (form logic, event handlers, driver operations) and `DSEFormHelper.cs` (static helpers for OS detection, admin checks, path resolution, native interop).\n\n**Single-file deployment:** NuGet dependencies are embedded as resources via `Resource.Embedder` and resolved at runtime through `AppDomain.CurrentDomain.AssemblyResolve` in `Program.cs`. This means the app ships as a single executable with embedded DLLs.\n\n**Data model:** `DriverStoreEntry` is the central data class representing a driver package in the store. It holds metadata (INF name, version, signer, size, device association) and utility methods for display formatting. `DriverStoreRepository` handles mapping between `%SystemRoot%\\INF` and the `DriverStore\\FileRepository` by comparing INF file contents.\n\n**Export pattern:** `IExport` interface with `CSVExporter` implementation. New export formats should implement this interface.\n\n## Key Conventions\n\n**Localization:** All user-facing strings go through `Rapr/Lang/Language.resx` (base English) with satellite `.resx` files per locale (e.g., `Language.fr-FR.resx`). Access strings via the generated `Language` class (e.g., `Language.Product_Name`). The base `Language.resx` uses `PublicResXFileCodeGenerator`. There are 20+ language files — never hardcode UI strings.\n\n**WinForms designer pattern:** Forms and controls follow the standard `*.cs` / `*.Designer.cs` / `*.resx` triple. Don't hand-edit `*.Designer.cs` files.\n\n**Settings:** User settings are defined in `Properties/Settings.settings` and accessed via `Properties.Settings.Default`. The app uses `PortableSettingsProvider` for portable config files alongside the executable.\n\n**ListView:** The driver list uses `ObjectListView` (via `BrightIdeasSoftware` namespace), customized in `MyObjectListView.cs`. Use OLV's virtual mode and column aspects rather than raw `ListView` APIs.\n\n**Code analysis:** `GlobalSuppressions.cs` contains project-level analyzer suppressions. The project uses `Microsoft.CodeAnalysis.NetAnalyzers` for static analysis during build.\n\n**Strong naming:** The assembly is strong-named (`Rapr.snk`). Third-party assemblies are re-signed via the `StrongNamer` NuGet package.\n\n**Namespace:** Main app code is in the `Rapr` namespace; utilities in `Rapr.Utils`; tests in `Rapr.Tests`.\n"},"files":{"AGENTS.md":"# Copilot Instructions for DriverStoreExplorer\n\n## Build & Test\n\nThis is a .NET Framework 4.7.2 Windows Forms application. Use **MSBuild** (not `dotnet build`).\n\n```powershell\n# Restore + Build\nnuget restore Rapr.sln\nmsbuild Rapr.sln /p:Configuration=Release /p:Platform=\"Any CPU\" /v:minimal\n\n# Run all tests (MSTest)\ndotnet test RaprTests\\RaprTests.csproj\n\n# Run a single test\ndotnet test RaprTests\\RaprTests.csproj --filter \"FullyQualifiedName~TestMethodName\"\n```\n\nThe CI workflow (`.github/workflows/ci.yml`) builds with MSBuild on `windows-latest`. There is no separate lint step — code analysis is handled by the `Microsoft.CodeAnalysis.NetAnalyzers` NuGet package at build time.\n\n## Architecture\n\n**Driver store abstraction:** The core pattern is `IDriverStore` (in `Rapr/Utils/`), which defines operations for enumerating, adding, deleting, and exporting driver packages. Three implementations exist:\n\n- `NativeDriverStore` — Windows native API via P/Invoke (`SetupAPI.cs`, `SafeNativeMethods.cs`)\n- `DismUtil` — DISM API via `Microsoft.Dism` NuGet package\n- `PnpUtil` — Parses `pnputil.exe` command output\n\n`DriverStoreFactory` creates the appropriate implementation based on user settings with automatic fallback based on OS capabilities. Each backend supports both online (local machine) and offline (mounted image) driver stores.\n\n**Main form split:** The main UI is split across `DSEForm.cs` (form logic, event handlers, driver operations) and `DSEFormHelper.cs` (static helpers for OS detection, admin checks, path resolution, native interop).\n\n**Single-file deployment:** NuGet dependencies are embedded as resources via `Resource.Embedder` and resolved at runtime through `AppDomain.CurrentDomain.AssemblyResolve` in `Program.cs`. This means the app ships as a single executable with embedded DLLs.\n\n**Data model:** `DriverStoreEntry` is the central data class representing a driver package in the store. It holds metadata (INF name, version, signer, size, device association) and utility methods for display formatting. `DriverStoreRepository` handles mapping between `%SystemRoot%\\INF` and the `DriverStore\\FileRepository` by comparing INF file contents.\n\n**Export pattern:** `IExport` interface with `CSVExporter` implementation. New export formats should implement this interface.\n\n## Key Conventions\n\n**Localization:** All user-facing strings go through `Rapr/Lang/Language.resx` (base English) with satellite `.resx` files per locale (e.g., `Language.fr-FR.resx`). Access strings via the generated `Language` class (e.g., `Language.Product_Name`). The base `Language.resx` uses `PublicResXFileCodeGenerator`. There are 20+ language files — never hardcode UI strings.\n\n**WinForms designer pattern:** Forms and controls follow the standard `*.cs` / `*.Designer.cs` / `*.resx` triple. Don't hand-edit `*.Designer.cs` files.\n\n**Settings:** User settings are defined in `Properties/Settings.settings` and accessed via `Properties.Settings.Default`. The app uses `PortableSettingsProvider` for portable config files alongside the executable.\n\n**ListView:** The driver list uses `ObjectListView` (via `BrightIdeasSoftware` namespace), customized in `MyObjectListView.cs`. Use OLV's virtual mode and column aspects rather than raw `ListView` APIs.\n\n**Code analysis:** `GlobalSuppressions.cs` contains project-level analyzer suppressions. The project uses `Microsoft.CodeAnalysis.NetAnalyzers` for static analysis during build.\n\n**Strong naming:** The assembly is strong-named (`Rapr.snk`). Third-party assemblies are re-signed via the `StrongNamer` NuGet package.\n\n**Namespace:** Main app code is in the `Rapr` namespace; utilities in `Rapr.Utils`; tests in `Rapr.Tests`.\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# Copilot Instructions for DriverStoreExplorer\n\n## Build & Test\n\nThis is a .NET Framework 4.7.2 Windows Forms application. Use **MSBuild** (not `dotnet build`).\n\n```powershell\n# Restore + Build\nnuget restore Rapr.sln\nmsbuild Rapr.sln /p:Configuration=Release /p:Platform=\"Any CPU\" /v:minimal\n\n# Run all tests (MSTest)\ndotnet test RaprTests\\RaprTests.csproj\n\n# Run a single test\ndotnet test RaprTests\\RaprTests.csproj --filter \"FullyQualifiedName~TestMethodName\"\n```\n\nThe CI workflow (`.github/workflows/ci.yml`) builds with MSBuild on `windows-latest`. There is no separate lint step — code analysis is handled by the `Microsoft.CodeAnalysis.NetAnalyzers` NuGet package at build time.\n\n## Architecture\n\n**Driver store abstraction:** The core pattern is `IDriverStore` (in `Rapr/Utils/`), which defines operations for enumerating, adding, deleting, and exporting driver packages. Three implementations exist:\n\n- `NativeDriverStore` — Windows native API via P/Invoke (`SetupAPI.cs`, `SafeNativeMethods.cs`)\n- `DismUtil` — DISM API via `Microsoft.Dism` NuGet package\n- `PnpUtil` — Parses `pnputil.exe` command output\n\n`DriverStoreFactory` creates the appropriate implementation based on user settings with automatic fallback based on OS capabilities. Each backend supports both online (local machine) and offline (mounted image) driver stores.\n\n**Main form split:** The main UI is split across `DSEForm.cs` (form logic, event handlers, driver operations) and `DSEFormHelper.cs` (static helpers for OS detection, admin checks, path resolution, native interop).\n\n**Single-file deployment:** NuGet dependencies are embedded as resources via `Resource.Embedder` and resolved at runtime through `AppDomain.CurrentDomain.AssemblyResolve` in `Program.cs`. This means the app ships as a single executable with embedded DLLs.\n\n**Data model:** `DriverStoreEntry` is the central data class representing a driver package in the store. It holds metadata (INF name, version, signer, size, device association) and utility methods for display formatting. `DriverStoreRepository` handles mapping between `%SystemRoot%\\INF` and the `DriverStore\\FileRepository` by comparing INF file contents.\n\n**Export pattern:** `IExport` interface with `CSVExporter` implementation. New export formats should implement this interface.\n\n## Key Conventions\n\n**Localization:** All user-facing strings go through `Rapr/Lang/Language.resx` (base English) with satellite `.resx` files per locale (e.g., `Language.fr-FR.resx`). Access strings via the generated `Language` class (e.g., `Language.Product_Name`). The base `Language.resx` uses `PublicResXFileCodeGenerator`. There are 20+ language files — never hardcode UI strings.\n\n**WinForms designer pattern:** Forms and controls follow the standard `*.cs` / `*.Designer.cs` / `*.resx` triple. Don't hand-edit `*.Designer.cs` files.\n\n**Settings:** User settings are defined in `Properties/Settings.settings` and accessed via `Properties.Settings.Default`. The app uses `PortableSettingsProvider` for portable config files alongside the executable.\n\n**ListView:** The driver list uses `ObjectListView` (via `BrightIdeasSoftware` namespace), customized in `MyObjectListView.cs`. Use OLV's virtual mode and column aspects rather than raw `ListView` APIs.\n\n**Code analysis:** `GlobalSuppressions.cs` contains project-level analyzer suppressions. The project uses `Microsoft.CodeAnalysis.NetAnalyzers` for static analysis during build.\n\n**Strong naming:** The assembly is strong-named (`Rapr.snk`). Third-party assemblies are re-signed via the `StrongNamer` NuGet package.\n\n**Namespace:** Main app code is in the `Rapr` namespace; utilities in `Rapr.Utils`; tests in `Rapr.Tests`.\n","category":"root","tokens":922}]}