Build from source
src/├── ExchangeApi.Web/ ASP.NET Core entry point - ~52 OData controllers,│ middleware (security headers · auth · rate limit · errors),│ hosted services, Explorer assets, Auth/ (30 narrow policies),│ Hosting/ (filter pushdown, rate limiter, drift probe, manifests)├── ExchangeApi.Metadata/ Entity POCOs + EntityCatalog (the canonical inventory) +│ reflection-driven EDM model (incl. alternate keys)├── ExchangeApi.PowerShell/ Dual runspace pools + ICmdletExecutor + PSObjectMapper +│ the cmdlet allowlist (the cardinal security gate)├── ExchangeApi.Explorer/ Static SPA (the Graph-Explorer-style UI)└── ExchangeApi.Operations/ Async job model (placeholder, see Status)
tools/├── MetadataGen/ Cmdlet-doc parser + POCO fidelity audit/curation├── ApiReferenceGen/ Regenerates the Markdown API catalog from the live manifests├── LicenseSigner/ Vendor-side offline ES256 license key signer (keygen / issue / inspect)└── WikiFreshnessRefresh/ Refreshes the Wiki freshness snapshot on a submodule bump
tests/ExchangeApi.Tests/ ~5,700 tests - WebApplicationFactory + unit + CSDL round-trip + Wiki-drift + param-completeness + example-coverage + concurrencyWiki/office-docs-powershell/ Git submodule: Microsoft's own cmdlet docs (the ground truth)dotnet restore ExchangeApi.slnxdotnet build ExchangeApi.slnxdotnet test ExchangeApi.slnx # → ~5,700 greenThe test suite is the contract. It enforces that we never send a parameter the docs don’t define, never silently drop a flag, keep the CSDL valid, keep every write body grounded in the cmdlet’s real syntax, that new routes ship an example (a ratchet), and that the runspace-pool concurrency is race-free. About 91% of the count is example-file lint; about 500 tests are behavioural.

