## [2.3.0] - 2026-09-10
### Added
- **`ConfigFile`**: `asJsonObject()` / `getRoot()` returning a deep clone of the root JSON object.
- **`ConfigFile`**: Path-based accessors — `getByPath`, `setByPath`, `getStringByPath`, `getIntByPath`, `getBooleanByPath`, `getDoubleByPath` (with default-value overloads).
- **`ConfigFile`**: `setBackupRotation(int)` for multi-generation `.bak` rotation on corrupted config recovery.
- **`ConfigFile`**: `reloadIfChanged()` to reload only when file size or mtime changed.
- **`ConfigFile`**: `setStableSave(boolean)` opt-in deterministic save via `JsonLib.stableStringify`.
- **`JaumlConfig`**: `invalidate(String, String)`, `invalidate(Path)`, and `clearCache()` for cache management.
- **`JsonMigrator`**: `setPreferredVersionKey(String)` to control which version key is read and updated during migration.
- **`JsonLib`**: `detectVersion(JsonElement, String preferredKey)` overload checking a preferred key first.
- **`JaumlInitializer`**: `initializeWithDemoConfig()` for explicit demo config workflow; `initialize()` now skips demo config write in production.
- **`JsonSchema`**: Optional constraint keywords — `enum`, `minimum`/`maximum`, `minLength`/`maxLength`, `additionalProperties: false`, and `minItems`/`maxItems`. Schemas that omit these keywords behave exactly as before.
- **`tn.naizo.jauml.util`**: Optional utility package — `PlatformUtil`, `JaumlLogger`, `ModuleVersion`, and `Lifecycle` helpers. Additive only; core config API unchanged.
### Changed
- **Build (Phase 4)**: Explicit `compileOnly` Gson and SLF4J API dependencies in all MultiLoader workspaces; `26.1.2` migrated from `buildSrc` to composite `build-logic` (aligned with `26.2`). See `BUILD.md`.
- **`ConfigFile`**: `save()` now writes atomically via a temp file and `Files.move` (with `ATOMIC_MOVE` when supported).
- **`JaumlInitializer`**: `initialize()` logs compatibility and library version but only writes demo config in development environments or when `-Djauml.writeDemoConfig=true`.
- **Version alignment**: `LIBRARY_VERSION`, all workspace `gradle.properties`, and all `MOD_VERSION` constants bumped to **2.3.0**.
- **README**: Fixed usage example to use `asJsonObject()` and typed getters instead of nonexistent `config.get()`.
### Fixed
- Documentation and migration guide updated for 2.3.0 compatibility matrix while preserving 2.0 API support.
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }