Changelog
[5.0.0] — unreleased
Added
Feature Flags & Entitlements
- Strongly-typed feature flags and entitlements built into the core
Cocoar.Configurationpackage FeatureFlagsbase class withFeatureFlag<T>properties — bare lambdas directly assignableEntitlementsbase class withEntitlement<T>properties- Fluent registration:
.UseFeatureFlags(f => f.Register<T>())and.UseEntitlements(e => e.Register<T>()) IFeatureFlagsDescriptors/IEntitlementsDescriptorsfor descriptor metadata- Health integration — expired flag classes report
Degradedautomatically - Roslyn source generator emits
CocoarFlagsDescriptorsat compile time IFeatureFlagEvaluator/IEntitlementEvaluatorfor REST evaluation endpoints- Context resolvers at global, class, and property levels
ConfigManager Builder API
ConfigManager.Create()static factory with fluent builder — replacesnew ConfigManager(...).Initialize()ConfigManager.CreateAsync()for async initialization withCancellationToken- Builder groups concerns:
.UseConfiguration(),.UseLogger(),.UseDebounce(),.UseSecretsSetup()
Package Consolidation (10+ → 7)
- Secrets, X509Encryption, Flags merged into core
Cocoar.Configuration - Flags.Generator merged into
Cocoar.Configuration.Analyzers - Secrets.Abstractions merged into
Cocoar.Configuration.Abstractions - Same types, same namespaces — fewer packages to install
Zero External Dependencies
- Removed
System.Reactivefrom all shipped packages - Lightweight internal reactive primitives (~200 lines)
- Public API unchanged —
IObservable<T>is BCL
Other Improvements
- Runtime recomputes are now fully async (no sync-over-async)
- Secrets memory safety: direct UTF-8 deserialization, DEK zeroing, no plaintext in error messages
- File provider security: symlink rejection, improved path traversal validation
- Health model simplification with
HealthTracker
Breaking Changes
ConfigManagerconstructors andInitialize()→internal. UseConfigManager.Create()AddCocoarConfiguration()→ builder API:c => c.UseConfiguration(rule => [...])- Secrets setup →
UseSecretsSetup()extension instead ofsetup.Secrets() - Testing:
ReplaceAllRules()→ReplaceConfiguration(),AppendTestRules()→AppendConfiguration()
See Migration Guide v4 → v5 for details.
[4.2.1] — 2026-02-03
Fixed
- Interface reactive configs:
IReactiveConfig<IInterface>now works for interfaces exposed viaExposeAs<IInterface>()
[4.2.0] — 2026-02-03
Added
- Abstractions packages:
Cocoar.Configuration.AbstractionsandCocoar.Configuration.Secrets.Abstractions AllowPlaintext(): Conditionally allow plaintext values inSecret<T>for development/testing- Testing setup overrides:
WithSetup()and optional setup parameter on test override methods
Fixed
- Deserialization failure logging (EventId 5100) instead of silent
null - DI registration ordering is now deterministic (sorted by type full name)
- Provider rebuild callback ordering fixed in
RuleProviderLease
[4.1.0] — 2026-01-11
Fixed
- Provider consistency: optional rules now return empty objects with C# defaults consistently across all providers
[4.0.0] — 2026-01-08
Added
- Testing Configuration Overrides:
CocoarTestConfigurationwithAsyncLocal<T>isolation - Secrets Package:
Secret<T>, X.509 hybrid encryption (RSA-OAEP + AES-256-GCM), password-less certificates - Secrets CLI:
generate-cert,convert-cert,cert-info,encrypt,decrypt - Analyzers Package: COCFG001–006
Breaking
- Provider contract:
byte[]instead ofJsonElement(internal — consuming apps unaffected)
[3.3.0] — 2025-10-23
Added
- Rule naming:
.Named("name")for health snapshots - Enhanced health monitoring:
RuleHealthEntrywith Name, ProviderType, ConfigType, Skipped status IConfigurationHealthServiceauto-registered in DI
[3.2.0] — 2025-10-23
Added
- CommandLine provider with multiple switch prefix support
[3.1.1] — 2025-10-19
Fixed
- Enum string conversion:
JsonStringEnumConverterfor string-to-enum deserialization
[3.1.0] — 2025-10-19
Added
- Interface deserialization:
setup.Interface<I>().DeserializeTo<T>()
[3.0.0]
Breaking
- Type-First API:
rule.File("...").For<T>()→rule.For<T>().FromFile("...") - When() signature:
Func<bool>→Func<IConfigurationAccessor, bool>
Added
- Config-aware conditional rules via
IConfigurationAccessorin.When()
See Migration Guide v2 → v3 for details.
[2.0.0] — 2025-09-30
Breaking
Rule.From.File()→rule.File()(lambda builder)Bind.Type<T>().To<I>()→setup.ConcreteType<T>().ExposeAs<I>()
[1.1.0] — 2025-09-25
IReactiveConfig<T>tuple support for atomic multi-config updates
[1.0.0] — 2025-09-21
- First stable release: 204 tests, health monitoring, reactive configuration
[0.9.0] — 2025-09-14
- Initial release