Repository navigation
v1.0.0
Summary
Compono 1.0 is the first stable release of a source-generated test composition ecosystem for modern .NET — no reflection, no runtime magic, object graphs and test-method parameters built by a real Roslyn incremental generator instead of guessed at runtime. Starting with this release, the public API is under Compono's stable compatibility promise: a breaking change requires a major-version bump, not a 0.x-era judgment call.
The core Compono package composes object graphs deterministically and reproducibly (seeded, pasteable-on-failure), with an explicit registration/rule/profile model and graph-wide value sharing (CompositionBuilder.Share<T>()) instead of ambient customization. Four first-party framework integrations — Compono.XunitV3, Compono.TUnit, Compono.MSTest, and Compono.NUnit — bring the same composed-parameter model to whichever test host a project already uses. Compono.TestDoubles generates AOT-safe interface doubles without a runtime-proxy dependency, and Compono.NSubstitute/Compono.Bogus bring automatic substitute composition and semantic fake data into the same pipeline for projects that want them. Compono.DependencyInjection, Compono.Http, and Compono.Logging round out the ecosystem with a configured-resolution IServiceProvider bridge, a reflection-free HttpClient test double, and structured ILogger/ILogger<T> capture and verification, respectively.
Compono is designed for trimming and Native AOT from the start, not retrofitted for it — every package's exercised public surface is verified against a real PublishAot-published, trimmed consumer, not merely assumed compatible.
1.0 is a compatibility boundary, not a finished feature set. Disposal/lifetime ownership and async composition remain deliberate, evidence-gated post-1.0 work (see RESEARCH-0015/RESEARCH-0016) — nothing in the current API blocks adding either later without a breaking change.
Changes
🚀 Features
- feat(samples): plan-0061 phase 2 - canonical Http/DependencyInjection/Logging scenarios (#130) @ncipollina, @claude
- feat(cleanup): plan-0061 phase 1 - pre-1.0 correctness and quality gate (#128) @ncipollina, @claude
- feat(nunit): add Compono.NUnit package (ADR-0059) (#127) @ncipollina, @claude
- feat(testdoubles): add invocation-aware callback responses (#118) @j-d-ha
- feat(mstest): add Compono.MSTest package (ADR-0057) (#120) @ncipollina, @claude
🐛 Bug Fixes
- fix(ci): plan-0062 package-validation gap fixes (#129) @ncipollina, @claude
- fix(ci): derive package-validation dependency ranges from Directory.Packages.props (#125) @ncipollina, @claude
- fix(xunitv3): preserve public constructors for AOT-safe ConfigProfileBinder (#124) @ncipollina
📚 Documentation
- docs: fix stale --prerelease install guidance, document dogfood Docker prerequisite (#131) @ncipollina, @claude
- docs(skill): refresh engineering-workflow skill to match current repo (#110) @j-d-ha
🔧 Maintenance
- chore(api): establish generator runtime hook policy (#126) @j-d-ha, @claude, @ncipollina
- chore: Bump the dotnet-minor-patch group with 3 updates (#121) @dependabot[bot]