Releases: xshaheen/headless-sdk
Releases · xshaheen/headless-sdk
Release list
0.3.5
What's changed
SDK behavior
MA0002now reports only non-ordinal string comparisons while remaining a warning.- Package projects now discover
THIRD-PARTY-NOTICESfiles with.TXT,.txt,.MD, and.mdextensions deterministically. - Test projects can set
MinimumExpectedTests; setting it to0omits the SDK-supplied Microsoft Testing Platform guard. - Direct xUnit v3 consumers now receive
XUNIT_ENTRYPOINT_DISABLE_WARNINGSonce, withEnableXunitEntryPointDisableWarnings=falseas an opt-out.
Tooling
- Updated
CSharpier.MSBuildfrom 0.30.2 to 1.3.0 and adopted its current C# and XML formatting contract. - Updated
Meziantou.Analyzerfrom 3.0.177 to 3.0.190. - Reviewed and accepted the upstream defaults for
MA0218,MA0219, andMA0220.
No runtime API behavior changed; this release changes build-time SDK configuration and package behavior.
0.3.4
What's changed
- Updated
Microsoft.CodeAnalysis.CSharp.Workspacesfrom 5.6.0 to 5.9.0. - Updated
MSBuild.StructuredLoggerfrom 2.3.244 to 2.3.246. - Reviewed and accepted Meziantou.Analyzer's informational
MA0216rule when running on the Roslyn 5.9 workspace surface.
No runtime or public API behavior changed.
Full changes: PR #46
0.3.3
What's changed
- Added
Roslynator.Formatting.Analyzers5.0.0 with suggestion-level structural blank-line rules around statements, regions, using lists, declarations, and documentation. - Kept accessor, brace, wrapping, indentation, and blank-line removal rules disabled to avoid conflicts with CSharpier.
- Updated
Roslynator.Analyzersto 5.0.0 andMeziantou.Analyzerto 3.0.177. - Strengthened analyzer package, policy, and scaffolded-editorconfig contract checks.
No runtime or public API behavior changed.
Full changes: PR #44
0.3.2
Changed
- Updated the bundled Meziantou analyzer from 3.0.159 to 3.0.165, adding Roslyn 5.9 support and upstream false-positive fixes.
- Recorded
MA0216at its upstream informational default without changing the SDK severity policy.
No public API or runtime behavior changed. See #43.
0.3.1
Changed
- Refreshed the SDK's shipped test-tool dependency contract: the Microsoft Testing Platform extensions move to 2.3.3 and CodeCoverage moves to 18.10.0. Central pins, SDK-injected versions, and package dependency ranges remain synchronized. (#36, #39)
- Updated the mandatory analyzer bundle to Meziantou.Analyzer 3.0.159 and Roslynator.Analyzers 4.16.1. Newly introduced
MA0213,MA0214, andMA0215rules retain their upstream disabled-by-default severity. (#38, #39) - Updated build dependencies and moved the repository toolchain to the .NET 10.0.400 security servicing release. (#39)
- Updated test SDK examples to xUnit 4.0.0. xUnit remains consumer-selected and is not injected by the SDK. (#39)
No public SDK API or configuration default changed in this release.
Validation
- Linux build, test, and package validation passed.
- Windows and macOS consumer smoke tests passed.
- All six package graphs report no known vulnerable or deprecated direct or transitive dependencies.
0.3.0
Added
- External Microsoft Testing Platform module runners can resolve the SDK-owned coverage denominator policy through
HeadlessCoverageSettingsPath. The evaluated property returns the absolute packageddefault.runsettingspath across project-SDK,global.jsonSDK, additional-SDK, andPackageReferenceconsumption. (#34)
Changed
- Project-evaluated coverage uses the same public property for its
--coverage-settingsargument, so module runners no longer need a consumer-owned runsettings copy. (#34) - Coverage excludes compiler and source-generator output under cross-platform
obj/**/generated/**paths while retaining the existing generated-file, generated-code attribute, migration, and test-assembly exclusions. (#34)
0.2.1
0.2.0
Original release date: 2026-08-02
Breaking Changes
- The bumped analyzer baseline introduces new rules that participate immediately under
AnalysisLevel=latest-alland escalate to errors on CI. This is intentional policy: the mandatory baseline tightens with each SDK release, and consumer code that was warning-free may need updates. Individual rules can now be disabled per project through the consumer's.editorconfig(see the NoWarn migration below). - Builds driven by AI coding agents now treat warnings as errors (
HeadlessIsLlmContext); agent sessions on code with pre-existing warnings fail where they previously succeeded. Opt out withHeadlessIsLlmContext=false. - Consumer
.editorconfigseverities for previously-NoWarn'd rules now take effect:/nowarnno longer wins, so a consumer config that raises one of those rules will start reporting it. Clearing$(NoWarn)no longer re-enables baseline-disabled rules; re-enablement goes through editorconfig severities. - Project-body downgrades of
Deterministic,AnalysisLevel, orAnalysisModeno longer take effect; the mandatory baseline is re-asserted after the project body in every consumption mode, closing a loophole in the documented authoritative contract. - The
embeddedandsnupkgsymbol formats embed untracked sources (including source-generator output) into shipped PDBs. Review generated content for sensitive values or opt out withEmbedUntrackedSources=false.
Added
- AI coding-agent detection (
HeadlessIsLlmContext, auto-detected from Claude Code, Codex, Cursor, Copilot, Gemini, Windsurf, Zed, Cline, Aider, and other agent environment variables): agent-driven builds treat compiler, analyzer, nullable, and MSBuild warnings as errors without inheriting CI-only behavior (SBOM, locked restore, coverage). Consumer-overridable withHeadlessIsLlmContext=false. - Analyzer rule-coverage gate: a repository test reflection-loads the nine mandatory analyzer packages, enumerates every supported diagnostic, and fails when an analyzer version bump introduces a rule that is neither tuned in a shipped editorconfig nor recorded in the reviewed package-defaults baseline — new rules now require an explicit severity decision instead of arriving silently.
Changed
- Advisory defaults (
WarningLevel,Features,ReportAnalyzer,SuppressNETCoreSdkPreviewMessage,CheckEolTargetFramework,SuppressTfmSupportBuildWarnings) are now guarded so a consumerDirectory.Build.propsvalue wins under both MSBuild-SDK andPackageReferenceconsumption. The mandatory baseline (Deterministic,AnalysisLevel,AnalysisMode, analyzer execution) is re-asserted after the project body, so both consumption modes now behave identically for it as well. - Analyzer-rule disables moved from
$(NoWarn)to the shipped editorconfigs asseverity = none, so a consumer.editorconfigcan re-enable any baseline-disabled rule per project (/nowarncannot be overridden downstream).$(NoWarn)now carries only diagnostics analyzer config cannot express:CS1712,NU5104, theCS1573/CS1591documentation pair, and the Aspire-hostCA1707relaxation. Test-project relaxations moved intoHeadless.NET.Sdk.Tests.editorconfig, andCA2007enforcement is now expressed purely through the baselinenoneplus theHeadlessEnforceConfigureAwaitoverlay. - Updated the mandatory analyzer baseline:
Meziantou.Analyzer3.0.75 → 3.0.125,Microsoft.CodeAnalysis.BannedApiAnalyzers4.14.0 → 5.6.0, andMicrosoft.VisualStudio.Threading.Analyzers17.14.15 → 18.7.23. The remaining six analyzer packages were already at their latest published versions. - Analyzer versions are now single-sourced through
Directory.Packages.propsand covered by the Dependabot anchor project, so analyzer bump PRs open automatically;VersionConsistencyTestsenforces consistency between the central pins, the shipped version properties, and the nuspec dependency ranges. - The
embeddedandsnupkgsymbol formats now defaultEmbedUntrackedSources=trueso untracked sources (source-generator output, generated files) stay debuggable from the PDB; SourceLink cannot fetch files the repository does not track. Consumer-set values win, andHeadlessSymbolFormat=nonestays on Microsoft defaults.
Fixed
GenerateSBOM=truenow resolves the SBOM tooling from the restore-resolved package location under MSBuild SDK consumption, fixing packs whenMicrosoft.Sbom.Targetsis satisfied from a NuGet fallback folder or shared cache. UnderPackageReferenceconsumption, restore evaluation cannot see package-delivered references (ExcludeRestorePackageImports), so such consumers must restore the tooling into their local packages folder before packing; this limitation is now documented in the shipped targets.- Integration-test consumer restores now use the host global packages folder as a read-only NuGet fallback and no longer pass
RestoreIgnoreFailedSources=true: restores resolve without network access in the common case, and genuine restore failures surface loudly instead of being masked. - The shipped packaging targets no longer inject the SDK author's tag into consumer
PackageTags; consumer tags pass through untouched. - Platform contract tests now report as skipped instead of passed when running on a non-matching operating system.
0.1.1
Original release date: 2026-07-27
Changed
- Updated build, test, and source-link dependencies, including the injected Microsoft Testing Platform extensions now shipped at 2.3.2.
- Updated repository CI to .NET SDK 10.0.302 and current GitHub Actions runtime dependencies.
0.1.0
Original release date: 2026-07-19
Breaking Changes
- Headless SDK behavior is now direct opt-in:
buildTransitiveassets are no longer shipped, so a project reference no longer propagates Headless policy to downstream projects. Add the appropriate Headless SDK directly to every project that should receive it. - Projects must declare
TargetFrameworkorTargetFrameworks; the removed inference switches no longer select a framework implicitly. Headless.NET.Sdk.Testis Microsoft Testing Platform-only. Migrate VSTest projects and removed VSTest properties to the MTP runner and extensions documented below.- Analyzer, editorconfig, NuGet audit, and SBOM infrastructure is authoritative. The removed infrastructure opt-outs no longer disable it; the three documented banned-symbol controls remain available.
- Legacy CI, single-file, SponsorLink alias, and generic xUnit/TUnit detection inputs were removed. Use
ContinuousIntegrationBuild,FileBasedProgram,DisableSponsorLink, and the explicit MTP/xUnit v3 configuration described below.
Added
- Added first-class contract coverage for all five supported consumption modes: direct
PackageReference, versioned project SDK, additional SDK, versionlessglobal.jsonMSBuild SDK resolution, and .NET 10#:sdkfile-based apps. All six SDK family members support every mode. - Added consumer tests against newly packed packages for restore, build, run, pack, static-graph evaluation, design-time evaluation, mixed and duplicate imports, multi-targeting outer and inner builds, target-framework compatibility, analyzer enforcement and opt-outs, CI warnings, locked restore, NuGet audit, SBOM generation, Microsoft Testing Platform execution, packaging defaults, and explicit consumer overrides.
- Added Windows validation for packed Windows Desktop WPF and Windows Forms consumers and macOS validation for a packed base-SDK consumer. Linux, Windows, and macOS validation must all pass before publication.
- Added
System.Collections.ArrayListandAssembly.GetAssembly(Type)to the general banned-symbol list. - Added SHA-256 package hashes and a six-package ID/version manifest so publication promotes and verifies the exact artifacts produced by the build job.
Changed
- All base and satellite
sdk,build, andbuildMultiTargetingimports are sentinel-guarded and evaluate exactly once across project-SDK, additional-SDK, mixed SDK plusPackageReference, static-graph, design-time, and multi-targeting outer/inner builds. Wrapper identity and pre-Directory.Build.props/pre-Microsoft-target ordering are preserved. - Satellite packages are self-contained: each carries its project-type wrapper plus the shared base build and configuration assets and no longer depends on resolving a separate
Headless.NET.Sdkpackage version. - All six packages use explicit, content-only MSBuild SDK nuspec contracts. Package assets are limited to
sdk,build,buildMultiTargeting,configurations, README, and logo content; dependencies use framework-agnostic groups, and the formerlib/netstandard2.0/_._compatibility marker is gone. - The repository is built with exactly .NET SDK
10.0.301(rollForward=disable), but Headless no longer restricts consumer target frameworks. Normal MSBuild projects must declareTargetFrameworkorTargetFrameworks; compatibility is determined by the selected Microsoft SDK and installed targeting packs or workloads. .NET 10 is required only for repository tooling and the file-app host. - Blazor WebAssembly and Windows Desktop file apps use the base
Microsoft.NET.Sdkwhile retaining their Headless satellite identity; normal projects continue to wrapMicrosoft.NET.Sdk.BlazorWebAssemblyandMicrosoft.NET.Sdk.WindowsDesktop. - File-based apps always receive the dedicated analyzer profile. Headless extra global usings now evaluate after the project body and are added only when
ImplicitUsingsisenable/trueand the consumer TFM is compatible withnet8.0. - In-project
HeadlessEnableStrictSystemTextJsonRuntimeDefaults=truenow evaluates after the consumer project body and adds the strict runtime switches only to inner builds compatible withnet9.0. - The nine analyzer packages are mandatory, private, SDK-owned dependencies. Their versions and asset metadata are reasserted after consumer item evaluation; duplicate consumer references cannot weaken or leak them, and conflicting Central Package Management entries are rejected instead of replacing the baseline.
Meziantou.Analyzerpackage projects retain the self-reference exception. - Analyzer execution, .NET analyzers, code-style enforcement, and the base, ConfigureAwait, file-app, and test editorconfig inputs are reasserted after the project body and included exactly once.
- The general and Newtonsoft.Json banned-symbol lists remain enabled by default but are independently configurable.
DisableSupportBannedSymbols=truedisables both lists,IncludeDefaultBannedSymbols=falsedisables the general list, andBannedNewtonsoftJsonSymbols=falsedisables only the Newtonsoft.Json list. TheMicrosoft.CodeAnalysis.BannedApiAnalyzerspackage remains mandatory analyzer infrastructure. - SponsorLink and Moq analyzer cleanup remains enabled by default.
DisableSponsorLink=falseis the sole supported opt-out that retains those analyzers. - CI provider variables are authoritative and
ContinuousIntegrationBuild=trueis the only manual activation input. CI now treats compiler, analyzer, nullable, and MSBuild warnings plus confirmed vulnerabilities (NU1901-NU1904) as errors; local Debug no longer defaults compiler warnings to errors, and Release alone no longer activates warning or vulnerability escalation. - NuGet restore, pack, signing, and feed diagnostics remain warnings under the CI compiler/MSBuild gate.
NU1900andNU1905remain warnings because they indicate unavailable audit data, while the visibleNETSDK1138end-of-life diagnostic remains non-fatal so Headless does not turn an otherwise targetable TFM into a framework restriction. Deterministic=trueis authoritative. Explicit consumer values are now preserved forRootNamespace,AssemblyName,ImplicitUsings,GenerateDocumentationFile, non-CICodeAnalysisTreatWarningsAsErrors,AccelerateBuildsInVisualStudio,NeutralLanguage,PreferredUILang,IsPackable, and the Test SDK'sIsPublishabledefault.- CI locked restore is enabled only when
packages.lock.jsonexists or a lateNuGetLockFilePathidentifies an existing lock file. Repositories without a lock file restore normally. - NuGet audit is authoritative at
NuGetAudit=true,NuGetAuditMode=all, andNuGetAuditLevel=low. DirectPackageReferenceconsumers must bootstrap first-clean-restore audit, lock, and warning policy in repository props or CLI arguments because NuGet cannot import package build assets before that initial restore. Headless.NET.Sdk.Testis Microsoft Testing Platform only. It defaults library output to an executable MTP host and supplies restore-visible, private, SDK-owned crash dump, code coverage, hang dump, hot reload, retry, and TRX extensions in every consumption mode; consumers continue to choose and version their test framework.- Base-SDK projects using
IsTestProject=trueorIsTestHarnessProject=truenow receive test analysis, editorconfig, warning-relaxation, and non-packable defaults only. The complete MTP host, extension dependencies, and command-line defaults requireHeadless.NET.Sdk.Test. - Test execution retains default TRX output, crash and hang dumps, a ten-minute hang timeout, a minimum-one-test guard, and CI coverage arguments. Analyzer suppression is now MTP-only and controlled by
OptimizeTestRun; xUnit global-using injection now applies only toxunit.v3.mtp-v2. - .NET 10 command hosts must select
Microsoft.Testing.Platformthroughglobal.json; this command-host setting is independent of the test project's target framework. Microsoft.Sbom.Targetsis now an exact, private, restore-visible dependency in every consumption mode. Headless owns its single targets import, generation remains opt-in throughGenerateSBOM=true, and requesting generation without restored tooling produces a targeted pack error.- Headless follows the Microsoft SDK default for
EmbedUntrackedSourcesinstead of forcing source embedding. - Package metadata now uses the general-purpose, consumer-facing SDK-family description, the repository README and logo, exact repository branch/commit provenance, and no license metadata. The family is not limited to Headless Framework consumers and is distributed through GitHub Packages and NuGet.org.
- Tag and manual workflow runs publish only to GitHub Packages after hash verification. Public and private packages are both supported; duplicate versions fail at the package push, and pushes are never retried automatically.
- Published GitHub Releases publish only to NuGet.org after the complete build/test/platform gate, SHA-256 verification, an exact release-tag/package-version match, and approval in the protected
NuGet Releaseenvironment. The release artifact set must contain exactly six.nupkgfiles and no.snupkgfiles; duplicate versions fail. - Publication is serialized across the package family with queued runs and bounded job timeouts. A partial feed publication is not retried automatically.
- CI now builds and packs once, tests the immutable packed artifact set, retains warnings in final logs, isolates clean-consumer NuGet caches outside source globs, and exposes a single Linux/Windows/macOS final status.
- Repository CI now retains TRX diagnostics without collecting non-gated coverage for the C# integration harness, and .NET workload integrity checking is no longer disabled. The Test SDK's consumer coverage extension and CI defaults are unchanged.
- Repository restore now clears inherited sources, uses NuGet.org as its only package and audit source, and no lo...