ktsu.AppDataStorage
1.16.0
Prefix Reserved
dotnet add package ktsu.AppDataStorage --version 1.16.0
NuGet\Install-Package ktsu.AppDataStorage -Version 1.16.0
<PackageReference Include="ktsu.AppDataStorage" Version="1.16.0" />
<PackageVersion Include="ktsu.AppDataStorage" Version="1.16.0" />
<PackageReference Include="ktsu.AppDataStorage" />
paket add ktsu.AppDataStorage --version 1.16.0
#r "nuget: ktsu.AppDataStorage, 1.16.0"
#:package ktsu.AppDataStorage@1.16.0
#addin nuget:?package=ktsu.AppDataStorage&version=1.16.0
#tool nuget:?package=ktsu.AppDataStorage&version=1.16.0
ktsu.AppDataStorage
A .NET library for simple, persistent application data management with JSON serialization.
Introduction
ktsu.AppDataStorage is a .NET library designed to simplify the process of persisting application data. It stores configuration or state data as JSON files in the user's application data folder, with built-in safety mechanisms like automatic backups, debounced saves, and thread-safe operations. The library provides a singleton-like access pattern and supports custom subdirectories and file names for organizing data.
Features
- Easy-to-use API: Inherit from
AppData<T>and get automatic JSON persistence withLoadOrCreate(),Save(), andGet(). - Automatic Backup: Creates backup files before overwriting to prevent data loss, with timestamped collision handling.
- Safe Write Pattern: Writes to a temporary file first, then atomically replaces the original to avoid corruption.
- Debounced Saves:
QueueSave()andSaveIfRequired()prevent frequent file writes with a 3-second debounce window. - Thread-Safe Operations: All file operations are synchronized with lock objects (uses
Locktype on .NET 9+,objecton earlier versions). - Singleton Access:
Get()provides lazy-initialized, singleton-like access to your app data instance. - Custom Storage Locations: Support for custom subdirectories and file names via
LoadOrCreate()overloads. - File System Abstraction: Uses
System.IO.Abstractionsfor easy unit testing with mock file systems. - Corrupt File Recovery: Automatically falls back to backup files when the main data file is corrupt or missing.
- Dispose-on-Exit: Registers for process exit to ensure queued saves are flushed before the application terminates.
Installation
Package Manager Console
Install-Package ktsu.AppDataStorage
.NET CLI
dotnet add package ktsu.AppDataStorage
Package Reference
<PackageReference Include="ktsu.AppDataStorage" Version="x.y.z" />
Usage Examples
Basic Example
Create a class that inherits from AppData<T>, where T is your custom data type.
using ktsu.AppDataStorage;
public class MySettings : AppData<MySettings>
{
public string Theme { get; set; } = "light";
public int FontSize { get; set; } = 14;
public bool AutoSave { get; set; } = true;
}
// Load existing data or create a new instance
var settings = MySettings.LoadOrCreate();
Console.WriteLine(settings.Theme); // "light"
Console.WriteLine(settings.FontSize); // 14
Accessing the Singleton Instance
The Get() method provides a lazy-initialized singleton instance, automatically calling LoadOrCreate() on first access.
using ktsu.AppDataStorage;
// Access the singleton from anywhere in your application
var settings = MySettings.Get();
settings.Theme = "dark";
settings.Save();
// Same instance returned every time
var sameSettings = MySettings.Get();
Console.WriteLine(sameSettings.Theme); // "dark"
Saving Data
Modify properties and call Save() to persist changes immediately.
using ktsu.AppDataStorage;
var settings = MySettings.Get();
settings.Theme = "dark";
settings.FontSize = 16;
settings.Save();
Custom Storage Location
Use overloads of LoadOrCreate() to store data in subdirectories or with custom file names.
using ktsu.AppDataStorage;
using ktsu.Semantics.Paths;
// Store in a subdirectory
var profileData = MySettings.LoadOrCreate(RelativeDirectoryPath.Create("profiles"));
// Store with a custom file name
var customData = MySettings.LoadOrCreate(FileName.Create("user_preferences.json"));
// Both subdirectory and custom file name
var specificData = MySettings.LoadOrCreate(
RelativeDirectoryPath.Create("profiles"),
FileName.Create("admin_settings.json"));
Advanced Usage
Queued and Debounced Saving
For scenarios with frequent updates (e.g., UI-driven changes), use QueueSave() to schedule a save that is debounced with a 3-second threshold. Call SaveIfRequired() periodically (e.g., in a game loop or timer) to flush queued saves.
using ktsu.AppDataStorage;
var settings = MySettings.Get();
settings.Theme = "dark";
settings.QueueSave(); // Schedules a save
// Later, in your update loop or timer:
settings.SaveIfRequired(); // Saves only if 3+ seconds have elapsed since QueueSave
// Or use the static convenience methods:
MySettings.QueueSave();
MySettings.SaveIfRequired();
Queued saves are also automatically flushed when the AppData<T> instance is disposed or when the process exits.
Testing with Mock File Systems
The library supports System.IO.Abstractions for testability. Configure a mock file system in your tests:
using System.IO.Abstractions.TestingHelpers;
using ktsu.AppDataStorage;
// In test setup - each thread gets its own isolated instance
AppData.ConfigureForTesting(() => new MockFileSystem());
// Run your tests...
var data = MySettings.LoadOrCreate();
data.Theme = "test";
data.Save();
// In test teardown
AppData.ResetFileSystem();
Directory and File Paths
Data is stored in a directory unique to the current application domain under the user's %APPDATA% folder. File names are derived from the class name in snake_case.
using ktsu.AppDataStorage;
// View the storage path
Console.WriteLine(AppData.Path);
// e.g., C:\Users\{user}\AppData\Roaming\{AppDomainName}
// File name is automatically generated from the class name
// MySettings -> my_settings.json
API Reference
AppData Static Class
Provides static helper methods and properties for managing application data storage.
Properties
| Name | Type | Description |
|---|---|---|
Path |
AbsoluteDirectoryPath |
The path where persistent data is stored for this application |
Methods
| Name | Return Type | Description |
|---|---|---|
WriteText<T>(T appData, string text) |
void |
Writes text to an app data file using a safe write pattern |
ReadText<T>(T appData) |
string |
Reads text from an app data file, falling back to backup if missing |
QueueSave<T>(this T appData) |
void |
Extension method that queues a debounced save operation |
SaveIfRequired<T>(this T appData) |
void |
Extension method that saves if the debounce threshold has elapsed |
ConfigureForTesting(Func<IFileSystem>) |
void |
Configures a mock file system factory for unit testing |
ResetFileSystem() |
void |
Resets the file system to the default implementation after testing |
AppData<T> Generic Abstract Class
Base class for app data storage. Inherit from this class to create persistable data types.
Type Constraints
T : AppData<T>, IDisposable, new()
Instance and Static Methods
| Name | Return Type | Description |
|---|---|---|
Get() |
T |
Gets the lazy-initialized singleton instance of the app data |
LoadOrCreate() |
T |
Loads app data from file or creates a new instance if none exists |
LoadOrCreate(RelativeDirectoryPath?) |
T |
Loads or creates with a custom subdirectory |
LoadOrCreate(FileName?) |
T |
Loads or creates with a custom file name |
LoadOrCreate(RelativeDirectoryPath?, FileName?) |
T |
Loads or creates with both custom subdirectory and file name |
Save() |
void |
Serializes and saves the app data to its JSON file |
QueueSave() |
void |
Queues a debounced save for the singleton instance |
SaveIfRequired() |
void |
Saves the singleton instance if the debounce threshold has elapsed |
Dispose() |
void |
Disposes the instance, flushing any queued saves |
Contributing
Contributions are welcome! Feel free to open issues or submit pull requests.
License
This project is licensed under the MIT License. See the LICENSE.md file for details.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- ktsu.CaseConverter (>= 1.3.12)
- ktsu.RoundTripStringJsonConverter (>= 1.0.10)
- ktsu.Semantics.Paths (>= 1.0.31)
- Polyfill (>= 9.9.0)
- TestableIO.System.IO.Abstractions (>= 22.1.0)
- TestableIO.System.IO.Abstractions.Wrappers (>= 22.1.0)
-
.NETStandard 2.1
- ktsu.CaseConverter (>= 1.3.12)
- ktsu.RoundTripStringJsonConverter (>= 1.0.10)
- ktsu.Semantics.Paths (>= 1.0.31)
- Polyfill (>= 9.9.0)
- TestableIO.System.IO.Abstractions (>= 22.1.0)
- TestableIO.System.IO.Abstractions.Wrappers (>= 22.1.0)
-
net10.0
- ktsu.CaseConverter (>= 1.3.12)
- ktsu.RoundTripStringJsonConverter (>= 1.0.10)
- ktsu.Semantics.Paths (>= 1.0.31)
- Polyfill (>= 9.9.0)
- TestableIO.System.IO.Abstractions (>= 22.1.0)
- TestableIO.System.IO.Abstractions.Wrappers (>= 22.1.0)
-
net7.0
- ktsu.CaseConverter (>= 1.3.12)
- ktsu.RoundTripStringJsonConverter (>= 1.0.10)
- ktsu.Semantics.Paths (>= 1.0.31)
- Polyfill (>= 9.9.0)
- TestableIO.System.IO.Abstractions (>= 22.1.0)
- TestableIO.System.IO.Abstractions.Wrappers (>= 22.1.0)
-
net8.0
- ktsu.CaseConverter (>= 1.3.12)
- ktsu.RoundTripStringJsonConverter (>= 1.0.10)
- ktsu.Semantics.Paths (>= 1.0.31)
- Polyfill (>= 9.9.0)
- TestableIO.System.IO.Abstractions (>= 22.1.0)
- TestableIO.System.IO.Abstractions.Wrappers (>= 22.1.0)
-
net9.0
- ktsu.CaseConverter (>= 1.3.12)
- ktsu.RoundTripStringJsonConverter (>= 1.0.10)
- ktsu.Semantics.Paths (>= 1.0.31)
- Polyfill (>= 9.9.0)
- TestableIO.System.IO.Abstractions (>= 22.1.0)
- TestableIO.System.IO.Abstractions.Wrappers (>= 22.1.0)
NuGet packages (4)
Showing the top 4 NuGet packages that depend on ktsu.AppDataStorage:
| Package | Downloads |
|---|---|
|
ktsu.CredentialCache
CredentialCache |
|
|
ktsu.SingleAppInstance
A .NET library that ensures only one instance of your application is running at a time. |
|
|
ktsu.GitIntegration
Git Integration |
|
|
ktsu.BlastMerge
Cross-repository file synchronization tool that uses intelligent iterative merging to unify multiple file versions with interactive conflict resolution. Features include batch processing with custom search paths and exclusion patterns, parallel file hashing for performance, persistent command history, and comprehensive automation capabilities for multi-repository workflows. Supports advanced diff visualization, pattern-based file discovery, and discrete processing phases with real-time progress reporting. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.16.0 | 49 | 2/19/2026 |
| 1.15.21 | 47 | 2/19/2026 |
| 1.15.20 | 70 | 2/18/2026 |
| 1.15.19 | 129 | 2/17/2026 |
| 1.15.18 | 110 | 2/16/2026 |
| 1.15.17 | 97 | 2/16/2026 |
| 1.15.17-pre.1 | 36 | 2/16/2026 |
| 1.15.16 | 110 | 2/14/2026 |
| 1.15.15 | 97 | 2/14/2026 |
| 1.15.14 | 409 | 2/6/2026 |
| 1.15.14-pre.11 | 46 | 2/6/2026 |
| 1.15.14-pre.10 | 42 | 2/5/2026 |
| 1.15.14-pre.9 | 43 | 2/4/2026 |
| 1.15.14-pre.8 | 43 | 2/3/2026 |
| 1.15.14-pre.7 | 46 | 2/3/2026 |
| 1.15.14-pre.6 | 44 | 2/2/2026 |
| 1.15.14-pre.5 | 55 | 2/1/2026 |
| 1.15.14-pre.4 | 46 | 1/31/2026 |
| 1.15.14-pre.3 | 53 | 1/31/2026 |
| 1.15.14-pre.2 | 46 | 1/31/2026 |
## v1.16.0 (minor)
Changes since v1.15.0:
- Fix sonarcube issues in tests ([@matt-edmondson](https://github.com/matt-edmondson))
- Add project configuration and documentation updates ([@matt-edmondson](https://github.com/matt-edmondson))
- Add SonarQube exclusions configuration to workflow ([@matt-edmondson](https://github.com/matt-edmondson))
- Update permissions in dotnet.yml and correct SonarLint project settings ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove legacy build scripts ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix SDK name typo and remove unnecessary testing platform properties ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor assembly visibility: remove InternalsVisibleTo attribute from AppData.cs and add AssemblyInfo.cs ([@matt-edmondson](https://github.com/matt-edmondson))
- Add [DoNotParallelize] attribute to TestSaveIfRequiredStaticMethod to prevent parallel execution ([@matt-edmondson](https://github.com/matt-edmondson))
- Update .NET version to 10.0 and adjust related configurations ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove redundant Microsoft.Testing.Extensions.CodeCoverage reference ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] Force a patch version with updated dependencies ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove redundant testing package references ([@matt-edmondson](https://github.com/matt-edmondson))
- Update configuration files and enhance build process ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove deprecated files and update AppData configuration ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] Force patch ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dependencies and CI workflows ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor CI workflow and update derived cursor rules ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor AppDataTests to reduce code duplication and enhance test clarity ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor AppDataTests to eliminate code duplication and improve maintainability ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor AppDataTests to improve maintainability and readability ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor test methods to reduce code duplication and improve readability ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance validation and timestamp handling in derived cursor rules ([@matt-edmondson](https://github.com/matt-edmondson))
- Improve validation for mock file systems in ConfigureForTesting method ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance test coverage and fix serialization exception handling ([@matt-edmondson](https://github.com/matt-edmondson))
- Update derived cursor rules and fix test compilation errors ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix test failures and improve exception handling in AppDataTests ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix test failures and enhance exception handling in AppDataTests ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance test coverage and improve exception handling ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor filesystem testing setup for thread safety and isolation ([@matt-edmondson](https://github.com/matt-edmondson))
- Add SpecStory configuration files and update project settings ([@matt-edmondson](https://github.com/matt-edmondson))
- Update ktsu.Sdk to version 1.30.0 and add packages ([@matt-edmondson](https://github.com/matt-edmondson))
- Update project SDK versions in AppDataStorage and AppDataStorage.Test ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix escaping in Git command strings in Get-VersionNotes function of PSBuild.psm1 ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] Update package references in project files ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor .editorconfig and update AppData classes to improve code style and consistency. Added copyright headers, adjusted variable declarations for clarity, and refined naming conventions in tests. Enhanced .editorconfig with detailed .NET code style settings and naming rules for better adherence to coding standards. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update README.md to enhance documentation on automatic version calculation and public API detection. Added detailed criteria for version increments based on commit history, including explicit version tags and public API changes, to clarify semantic versioning practices. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance Get-VersionType function in PSBuild module to include detailed version bump criteria based on commit history and public API changes. Updated documentation to clarify major, minor, patch, and prerelease bump rules, improving version determination accuracy. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor Get-VersionType function in PSBuild module to improve version determination logic. Removed redundant file exclusion patterns and introduced public API change detection using git diff. This enhancement allows for more accurate minor version increments based on public API modifications. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor Get-VersionNotes function in PSBuild module to improve commit retrieval logic. Enhanced commit filtering by including full commit information with hashes for uniqueness, and structured output for better changelog formatting. This change ensures accurate representation of commits in the generated version notes. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor Get-GitTags and Get-VersionType functions in PSBuild module to improve git tag retrieval and version increment logic. Enhanced handling of versioning suffixes and commit message parsing for version determination. Updated changelog generation to include more robust commit filtering and improved output formatting. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor PSBuild module to improve Git command execution by ensuring proper quoting in various functions. This change enhances the reliability of versioning and commit operations, and improves the clarity of the commit range logic. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml workflow to ensure WorkspacePath is correctly set and enhance Write-InformationStream function to support pipeline input for Object parameter. This improves the flexibility of the logging function and maintains consistency in the CI/CD process. ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix quoting in IS_TAGGED assignment in Get-BuildConfiguration function to ensure proper evaluation of GitSha. This change enhances the reliability of the build configuration logic. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance logging in Invoke-ExpressionWithLogging function by adding information output for both command strings and script blocks. This improves visibility into the execution process and aids in debugging. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add Command parameter to Invoke-ExpressionWithLogging function in PSBuild module to allow execution of string commands as script blocks. Enhanced parameter handling and documentation for clarity. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor Invoke-ExpressionWithLogging function in PSBuild module to allow pipeline input for ScriptBlock parameter. Improved clarity by adding a conditional check before displaying and executing the script block. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor PSBuild module to reorganize module variables and PowerShell preferences. Moved variable definitions and preferences to a new section for improved clarity and maintainability. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update PSBuild module to include new utility functions: Get-GitLineEnding, Set-GitIdentity, Write-InformationStream, and Invoke-ExpressionWithLogging. Removed version number from the header for cleaner documentation. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update PSBuild module to version 1.1.0 with enhancements including improved object model using PSCustomObjects, better git status detection, and comprehensive help comments. Added new utility functions and updated documentation to reflect changes. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor Update-ProjectMetadata function to improve git status logging. Removed redundant git status checks and enhanced output clarity by indicating whether changes were detected before committing. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor PSBuild module to enhance versioning logic and output structure. Updated output types to PSCustomObject for better data handling, added detailed documentation for functions, and improved error handling in metadata updates. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance logging and error handling in CI/CD pipeline and build scripts. Added detailed information output for build configuration, improved error messages, and refactored logging functions for consistency across the workflow. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor New-Changelog function to restore line ending handling. Moved line ending retrieval back into the function to ensure consistent formatting in changelog generation. ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove global.json configuration file and update project SDK references in AppDataStorage and AppDataStorage.Test to version 1.8.0 for improved compatibility. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor PSBuild module for improved versioning logic and changelog generation. Removed commented-out debug statements, streamlined version type determination, and enhanced handling of line endings. Updated changelog generation to ensure accurate entries for initial releases and improved output clarity. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add VSCode configuration files for .NET Core development. Introduced launch.json for debugging and tasks.json for build, publish, and watch tasks, enhancing the development workflow. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add OutputType attribute to Invoke-BuildWorkflow, Invoke-ReleaseWorkflow, and Invoke-CIPipeline functions for improved output clarity ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix NuGet API key reference in Invoke-ReleaseWorkflow function to use BuildConfiguration.NuGetApiKey for correct package publishing. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update logging parameters in Invoke-DotNetPublish function to utilize structured console logger for improved output clarity during the build process. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update PSBuild module metadata and function exports to enhance versioning and automation capabilities. Changed GUID, updated copyright information, and expanded function exports to include new version management, utility, and workflow functions. Enhanced module description and release notes to reflect new features and improvements. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update Invoke-CIPipeline function to access Version and ReleaseHash from metadata.Data for improved data structure alignment ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor New-Changelog and Update-ProjectMetadata functions in PSBuild module ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor PSBuild module to replace Write-Warning and Write-Error with Write-Host for improved logging consistency ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor Invoke-CIPipeline function in PSBuild module to improve error handling and streamline metadata updates. Removed redundant build configuration checks and added debugging support for better traceability during the build process. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add Version and ReleaseHash properties directly to BuildConfiguration in Invoke-CIPipeline function ([@matt-edmondson](https://github.com/matt-edmondson))
- Add Version and ReleaseHash properties to BuildConfiguration in Invoke-CIPipeline function ([@matt-edmondson](https://github.com/matt-edmondson))
- Add ServerUrl parameter to Get-BuildConfiguration function in PSBuild module ([@matt-edmondson](https://github.com/matt-edmondson))
- Add additional parameters to Get-BuildConfiguration function in PSBuild module ([@matt-edmondson](https://github.com/matt-edmondson))
- Update PSBuild module to change parameter types for Get-BuildConfiguration and Invoke-CIPipeline functions. Added OutputType attribute to Get-BuildConfiguration and modified Invoke-CIPipeline to accept a PSCustomObject for BuildConfiguration, enhancing type safety and output management. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor Invoke-CIPipeline function in PSBuild module to remove unnecessary metadata initialization and ensure consistent handling of ReleaseHash. Update logic to utilize metadata for release processing and improve error handling for null scenarios. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance Update-ProjectMetadata function to include current commit hash logging and update ReleaseHash handling based on changes. Introduced HasChanges flag to indicate if metadata was updated. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance Update-ProjectMetadata function in PSBuild module by adding version generation, license creation, and changelog generation. Implemented authors file creation and project URL shortcuts for improved project documentation and accessibility. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance Invoke-CIPipeline function in PSBuild module by initializing metadata variable and improving error handling for metadata updates. Ensure proper handling of null metadata scenarios to provide clearer error messages during CI/CD processes. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add Set-GitIdentity function to PSBuild module for configuring git user identity in automated operations. Update related functions to utilize this new feature and enhance README.md documentation. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add utility functions to PSBuild module and update README.md for enhanced documentation ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor Update-ProjectMetadata function in PSBuild module to streamline metadata updates. Enhanced logging for git operations, including status checks and commit outputs. Improved parameter handling for optional authors and push settings, ensuring better feedback during CI/CD processes. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update README.md to enhance usage instructions for Invoke-CIPipeline. Added new parameters for NuGet API key and configuration options, and improved output messages for pipeline success and version release. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update PSBuild module documentation and usage examples in README.md. Refine module description and enhance installation instructions. Remove outdated usage examples and clarify version control features. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor PSBuild module to standardize line endings across generated files. Introduced Get-GitLineEnding function to determine appropriate line endings based on git configuration. Updated file writing methods to ensure consistent encoding and line endings for VERSION.md, LICENSE.md, CHANGELOG.md, AUTHORS.md, and URL files. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance PSBuild module with additional logging for git operations. Added informative output for git user configuration, status checks, file additions, commits, and pushes. Improved user feedback during metadata updates to facilitate better traceability in CI/CD processes. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance PSBuild module with improved logging and error handling. Added detailed output for git commands and refined version type analysis. Introduced step headers for better traceability during CI/CD execution. Updated metadata handling to ensure robust error management and commit processes. ([@matt-edmondson](https://github.com/matt-edmondson))
- Improve error handling and logging in PSBuild module. Added try-catch blocks for repository information retrieval and enhanced error messages for build configuration, metadata updates, and build workflows. Introduced step headers for better traceability during CI/CD pipeline execution. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance version tag retrieval in PSBuild module by adding logic to find the closest lower version if an exact match is not found. Improve changelog generation to skip already processed tags and ensure only valid version tags are included. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor PSBuild module to standardize output structure using PSCustomObject, enhancing error handling and improving clarity in build and version information retrieval. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update PSBuild module to make ServerUrl parameter mandatory and enable debugging in CI/CD pipeline function for enhanced traceability. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update PSBuild module to use PSCustomObject for output types and adjust verbosity levels in dotnet commands for improved logging clarity. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor return statements in PSBuild module functions to use PSCustomObject for improved structure and clarity in returned metadata. ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove metadata update step from the release workflow in PSBuild module to streamline the process. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor Assert-LastExitCode calls in Invoke-DotNetRestore, Invoke-DotNetBuild, and Invoke-DotNetTest functions of PSBuild module to remove unnecessary command parameter. This change simplifies the error handling logic while maintaining clarity in logging. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update console logger parameters in Invoke-DotNetRestore function of PSBuild module to use a standardized format. This change improves logging detail and consistency in CI output by utilizing the Microsoft.Build.Logging.ConsoleLogger. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor console logger parameters in Invoke-DotNetBuild, Invoke-DotNetTest, and Invoke-DotNetPack functions of PSBuild module to use a standardized format. This change enhances clarity and consistency in CI output by utilizing the Microsoft.Build.Logging.ConsoleLogger for improved logging detail. ([@matt-edmondson](https://github.com/matt-edmondson))
- Standardize console logger parameters in Invoke-DotNetBuild and Invoke-DotNetTest functions of PSBuild module to use quotes for improved clarity and consistency in CI output. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update version component checks in PSBuild module to use array count for improved clarity and consistency. This change enhances the handling of versioning and changelog generation processes. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor New-Changelog function in PSBuild module to improve tag handling by using array count for better clarity. Updated console output message to reflect the change, enhancing consistency in versioning processes. ([@matt-edmondson](https://github.com/matt-edmondson))
- Replace Write-Output with Write-Host in PSBuild module for improved console logging consistency. This change enhances the clarity of output messages during build and versioning processes. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor Update-ProjectMetadata function in PSBuild module to replace Version and CommitHash parameters with GitSha and ServerUrl. Update metadata generation process to return a hashtable containing version and release hash, enhancing clarity and consistency in CI/CD workflows. ([@matt-edmondson](https://github.com/matt-edmondson))
- Standardize console logger parameters in PSBuild module for build, test, and pack functions. Updated verbosity settings to use 'Summary' for improved output clarity and consistency across CI/CD processes. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refine console logger parameters in Invoke-DotNetRestore function of PSBuild module by removing 'Summary' from verbosity settings. This change improves output clarity and maintains consistency with previous logging updates in CI/CD processes. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update console logger parameters in Invoke-DotNetRestore function of PSBuild module to use 'Summary' instead of 'ShowTimestamp'. This change enhances output clarity and maintains consistency with previous updates to logging settings in CI/CD processes. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance Get-BuildConfiguration function in PSBuild module by adding detailed logging of build configuration parameters. This update improves visibility of repository status, build settings, paths, and artifact patterns, aiding in CI/CD processes. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refine console logger parameters in Invoke-DotNetRestore function of PSBuild module. Updated parameters to enhance output clarity by removing unnecessary options and standardizing verbosity settings for improved consistency in CI/CD processes. ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove unnecessary --no-logo option from dotnet restore command in PSBuild module for cleaner output. This change maintains consistency with previous updates to console logger parameters. ([@matt-edmondson](https://github.com/matt-edmondson))
- Standardize console logger parameters in PSBuild module for dotnet commands. Updated restore, pack, and publish functions to use the /p:ConsoleLoggerParameters syntax for improved clarity and consistency in output across CI/CD processes. ([@matt-edmondson](https://github.com/matt-edmondson))
- Standardize console logger parameters in PSBuild module for dotnet commands. Updated restore, test, pack, and publish functions to include ForceNoAlign and ShowTimestamp options, enhancing output clarity and consistency in CI/CD environments. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor PSBuild module to standardize dotnet command logging. Updated logger parameters for restore, build, test, pack, and publish functions to improve output consistency and clarity in CI/CD environments. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update PSBuild module to enhance logging verbosity for dotnet commands. Added console logger parameters for improved output during restore, build, test, pack, and publish operations, ensuring better visibility in CI/CD processes. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance PSBuild module with improved version analysis and logging. Updated Get-VersionType function to provide detailed reasoning for version increments based on commit analysis. Enhanced output for version information retrieval and streamlined command execution in various functions for better visibility during CI/CD processes. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor Invoke-ReleaseWorkflow and Invoke-CIPipeline functions to ensure GitSha and WorkspacePath parameters are validated for null or empty values. Updated version information retrieval to convert GitSha to string for consistency in metadata updates. ([@matt-edmondson](https://github.com/matt-edmondson))
- Readd icon ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove icon to fix lfs ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor project file detection in Invoke-ReleaseWorkflow function to improve accuracy. Updated the check for .csproj files to count existing projects instead of relying on Test-Path, enhancing the robustness of the packaging process. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update AUTHORS.md handling in PSBuild module to preserve existing file and improve metadata generation logic. The script now ensures that the AUTHORS.md file is only generated if it does not already exist, while also enhancing documentation for metadata updates. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance Invoke-DotNetBuild function with improved logging and error handling. Added explicit logger parameters for CI output, implemented a retry mechanism with detailed verbosity on build failures, and included checks for project files to assist in diagnosing build issues. This update aims to streamline the build process and provide clearer feedback during CI/CD operations. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update PSBuild module with enhanced documentation, improved error handling, and refined function exports. Added detailed usage instructions and author information, updated command execution for better error reporting, and improved parameter descriptions for clarity. This refactor aims to streamline the CI/CD pipeline process for .NET applications. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance Invoke-DotNetPack and Invoke-ReleaseWorkflow functions to support project-specific packaging and improved error handling. Added parameters for verbosity and project selection, along with checks for project existence before packaging. Updated release workflow to conditionally skip packaging and improved logging for package creation and publishing steps. ([@matt-edmondson](https://github.com/matt-edmondson))
- Improved handling of .csx file detection and enhanced tag retrieval logic to ensure proper array handling. Updated changelog generation to accommodate various tag scenarios, ensuring robust versioning checks. ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove Directory.Build.props and Directory.Build.targets files to streamline project configuration and eliminate unused properties. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add global.json for SDK configuration and update project files to use ktsu SDKs ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor .NET CI workflow to enhance build and release processes. Updated job names for clarity, improved error handling in PowerShell scripts, and added caching for NuGet packages. Introduced a new release job that packages and publishes libraries, applications, and generates release notes. Adjusted permissions and environment variables for better security and functionality. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance Dependabot workflow by adding a timeout and improving logging for PR processing. Updated the step names for clarity and ensured proper handling of PR URLs during auto-merge operations. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor PowerShell scripts for version management and metadata handling. Introduced a common module for shared functions, streamlined git configuration, and improved commit metadata processing. Updated `make-changelog.ps1` and `make-version.ps1` to utilize new functions for determining version types and managing environment variables. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance changelog and versioning logic in PowerShell scripts. Added checks for non-merge commits, code changes, and commit message tags to determine version type (major, minor, patch, prerelease) for changelog generation. Updated `make-version.ps1` to streamline version increment logic based on commit presence and tags. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update README with improved documentation and API reference ([@matt-edmondson](https://github.com/matt-edmondson))
- Update .editorconfig to include additional file types and formatting rules ([@matt-edmondson](https://github.com/matt-edmondson))
- Update packages ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor AppData locking mechanism and improve README ([@matt-edmondson](https://github.com/matt-edmondson))
- Add LICENSE template ([@matt-edmondson](https://github.com/matt-edmondson))
- Apply new editorconfig ([@matt-edmondson](https://github.com/matt-edmondson))
- Don't serialise the lock member ([@Damon3000s](https://github.com/Damon3000s))
- Fix typo in variable name in make-changelog.ps1 ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix typo in variable name and remove unnecessary logging in make-changelog.ps1 ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance changelog formatting by adding additional line breaks for improved readability ([@matt-edmondson](https://github.com/matt-edmondson))
- Add logging for note generation in MakeNotesForRange function ([@matt-edmondson](https://github.com/matt-edmondson))
- Add changelog entry for changes since the specified tag in MakeNotesForRange function ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor version type checks in MakeNotesForRange function and add exclusion for PowerShell files in make-version.ps1 ([@matt-edmondson](https://github.com/matt-edmondson))
- Add VERSION_TYPE variable to MakeNotesForRange function ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix range check in MakeNotesForRange function to handle additional version format ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor scripts and update workflow parameters ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix syntax error in make-license.ps1 command in dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Modularize PowerShell scripts in dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Update .mailmap for user and bot email consistency ([@matt-edmondson](https://github.com/matt-edmondson))
- Move IS_PRERELEASE assignment to where its actually gonna work ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor bot commit exclusion patterns in dotnet workflow for improved clarity and case-insensitivity ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix regex for bot commit exclusion patterns in dotnet workflow ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor bot commit exclusion patterns in dotnet workflow for case-insensitivity ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor exclusion patterns in dotnet workflow to simplify bot commit filtering ([@matt-edmondson](https://github.com/matt-edmondson))
- Sort git tags when retrieving the last released version in dotnet workflow ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor exclusion patterns in dotnet workflow for improved clarity and consistency ([@matt-edmondson](https://github.com/matt-edmondson))
- Update exclusion pattern for hidden files in dotnet workflow ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove URL escaping from workflow and adjust environment variable output ([@matt-edmondson](https://github.com/matt-edmondson))
- Move shared workflow into local workflow ([@matt-edmondson](https://github.com/matt-edmondson))
- Renamed metadata files ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix license ([@matt-edmondson](https://github.com/matt-edmondson))
- Replace LICENSE file with LICENSE.md ([@matt-edmondson](https://github.com/matt-edmondson))
- Update .NET workflow to trigger on main and develop branches ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor AppData to use Lazy<T> for internal state ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor tests and add null checks for deserialized data ([@matt-edmondson](https://github.com/matt-edmondson))
- Update MSTest.TestFramework to version 3.7.0 ([@matt-edmondson](https://github.com/matt-edmondson))
- dotnet-pipeline.yml renamed to dotnet-workflow.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Add compatibility suppressions and update build properties ([@matt-edmondson](https://github.com/matt-edmondson))
- Add comprehensive tests for AppData methods ([@matt-edmondson](https://github.com/matt-edmondson))
- Add new tests for StrongName and Storage classes ([@matt-edmondson](https://github.com/matt-edmondson))
- Update project to target both .NET 8.0 and .NET 9.0 ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance AppDataTests with new tests and improvements ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor TestStrongStrings for proper resource disposal ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor AppData class for robustness and flexibility ([@matt-edmondson](https://github.com/matt-edmondson))
- Add new tests and update namespace in AppDataTests.cs ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance AppData functionality and documentation ([@matt-edmondson](https://github.com/matt-edmondson))
- Update README with Static Instance Access feature ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance AppDataStorage docs and add new examples ([@matt-edmondson](https://github.com/matt-edmondson))
- Update ktsu.ToStringJsonConverter package version to 1.0.26 ([@matt-edmondson](https://github.com/matt-edmondson))
- Update ktsu.StrongPaths package version to 1.1.31 ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dependencies ([@matt-edmondson](https://github.com/matt-edmondson))
- Update package versions in AppDataStorage.csproj ([@matt-edmondson](https://github.com/matt-edmondson))
- Make test classes and records public; update NoWarn property ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor visibility and enhance type conversion ([@matt-edmondson](https://github.com/matt-edmondson))
- Migrate ktsu.io to ktsu namespace ([@matt-edmondson](https://github.com/matt-edmondson))
- Update VERSION ([@matt-edmondson](https://github.com/matt-edmondson))
- Migrate ktsu.io to ktsu namespace ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix a crash on first launch if you dont have the app data directory ([@matt-edmondson](https://github.com/matt-edmondson))
- Update VERSION ([@matt-edmondson](https://github.com/matt-edmondson))
- Take latest StrongPaths ([@matt-edmondson](https://github.com/matt-edmondson))
- Add reading and writing to arbitrary files within the app directory ([@matt-edmondson](https://github... (truncated due to NuGet length limits)