feat(winmd-api-search): add WinMD cache generator script and related files (#45606)
<!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? --> ## Summary of the Pull Request Adds a new Copilot agent skill (`winmd-api-search`) that lets AI agents discover and explore Windows desktop APIs by searching a local cache of WinMD metadata. The skill covers Windows Platform SDK, WinAppSDK/WinUI, NuGet package WinMDs, and project-output WinMDs — providing full API surface details (types, members, enumeration values, namespaces) without needing external documentation lookups. **Key components:** - `.github/skills/winmd-api-search/SKILL.md` — Skill definition with usage instructions, search/detail workflows, and scoring guidance - `scripts/Invoke-WinMdQuery.ps1` — PowerShell query engine supporting actions: `search`, `type`, `members`, `enums`, `namespaces`, `stats`, `projects` - `scripts/Update-WinMdCache.ps1` — Orchestrator that builds the C# cache generator, discovers project files, and runs the generator - `scripts/cache-generator/CacheGenerator.csproj` + `Program.cs` — .NET console app using `System.Reflection.Metadata` to parse WinMD files from NuGet packages, project references, Windows SDK, and packages.config into per-package JSON caches - `scripts/cache-generator/Directory.Build.props`, `Directory.Build.targets`, `Directory.Packages.props` — Empty isolation files to prevent repo-level Central Package Management and build targets from interfering with this standalone tool <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [ ] Closes: #xxx <!-- Replace with issue number if applicable --> - [x] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [ ] **Tests:** Added/updated and all pass — N/A: This is an offline agent skill (PowerShell + standalone .NET tool) with no integration into the main product build or runtime. Validated manually by running the cache generator across multiple project contexts (ColorPickerUI, CmdPal.UI, runner, ImageResizer, etc.) and exercising all query actions. - [ ] **Localization:** All end-user-facing strings can be localized — N/A: No end-user-facing strings; this is an internal developer/agent tool - [ ] **Dev docs:** Added/updated — The SKILL.md itself serves as the documentation - [ ] **New binaries:** Added on the required places — N/A: The cache generator is a standalone dev-time tool, not shipped in the installer - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: N/A <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments ### Cache Generator (`Program.cs`, ~1000 lines) A self-contained .NET console app that: 1. **Discovers WinMD sources** from four channels: - `project.assets.json` (PackageReference — modern .csproj/.vcxproj) - `packages.config` (legacy NuGet format) - `<ProjectReference>` bin/ output (class libraries producing `.winmd`) - Windows SDK `UnionMetadata/` (highest installed version) 2. **Parses WinMD files** using `System.Reflection.Metadata` / `PEReader` to extract: - Types (classes, structs, interfaces, enums, delegates) with full namespace - Members (methods with decoded signatures/parameters, properties with accessors, events) - Enum values - Base types and type kinds 3. **Outputs per-package JSON** under `Generated Files/winmd-cache/`: - `packages/<Id>/<Version>/meta.json` — package summary (type/member/namespace counts) - `packages/<Id>/<Version>/namespaces.json` — ordered namespace list - `packages/<Id>/<Version>/types/<Namespace>.json` — full type detail per namespace - `projects/<ProjectName>.json` — maps each project to its package set 4. **Deduplicates** at the package level — if a package+version is already cached, it's skipped on subsequent runs. ### Build Isolation Three empty MSBuild files (`Directory.Build.props`, `Directory.Build.targets`, `Directory.Packages.props`) in the cache-generator folder prevent the repo's Central Package Management and shared build configuration from interfering with this standalone tool. ### Query Engine (`Invoke-WinMdQuery.ps1`) Supports seven actions: `search` (fuzzy text search across types/members), `type` (full detail for a specific type), `members` (filtered members of a type), `enums` (enumeration values), `namespaces` (list all namespaces), `stats` (cache statistics), and `projects` (list cached projects with their packages). <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed 1. **Cache generation:** Ran `Update-WinMdCache.ps1` across 310+ project files in the repo — 8 packages parsed, 316 reused from cache, all completed without errors 2. **Query testing on multiple projects:** - `ColorPickerUI` — verified Windows SDK baseline (7,023 types) - `Microsoft.CmdPal.UI.ViewModels` (after restore) — verified 13 packages, 49,799 types, 112,131 members including WinAppSDK, AdaptiveCards, CsWinRT, Win32Metadata - `runner` (C++ vcxproj) — verified packages.config fallback path - `ImageResizerExt` — verified project reference WinMD discovery 3. **All seven query actions validated:** `stats`, `search`, `namespaces`, `type`, `enums`, `members`, `projects` — all returned correct results 4. **Spell-check compliance:** SKILL.md vocabulary reviewed against repo's check-spelling dictionaries; replaced flagged words with standard alternatives --------- Co-authored-by: Copilot <[email protected]> Co-authored-by: Copilot <[email protected]>
G
Gordon Lam committed
eeeb6c0c9341dd73e04586032a87f94aeb8a1e84
Parent: 70e082c
Committed by GitHub <[email protected]>
on 3/11/2026, 2:15:32 AM