ktsu.Semantics.Paths
2.5.1
Prefix Reserved
dotnet add package ktsu.Semantics.Paths --version 2.5.1
NuGet\Install-Package ktsu.Semantics.Paths -Version 2.5.1
<PackageReference Include="ktsu.Semantics.Paths" Version="2.5.1" />
<PackageVersion Include="ktsu.Semantics.Paths" Version="2.5.1" />Directory.Packages.props
<PackageReference Include="ktsu.Semantics.Paths" />Project file
paket add ktsu.Semantics.Paths --version 2.5.1
#r "nuget: ktsu.Semantics.Paths, 2.5.1"
#:package ktsu.Semantics.Paths@2.5.1
#addin nuget:?package=ktsu.Semantics.Paths&version=2.5.1Install as a Cake Addin
#tool nuget:?package=ktsu.Semantics.Paths&version=2.5.1Install as a Cake Tool
ktsu.Semantics.Paths
Polymorphic, strongly-typed file system path types that keep files, directories, absolute, and relative paths distinct at compile time.
License NuGet Version NuGet Version NuGet Downloads GitHub commit activity GitHub contributors GitHub Actions Workflow Status
ktsu.Semantics.Paths is one package in the ktsu.Semantics family. It builds on ktsu.Semantics.Strings, which supplies the underlying SemanticString<T> machinery.
Introduction
ktsu.Semantics.Paths models a file system path as a type, not a bare string. The type encodes two independent facts: whether the path names a file or a directory, and whether it is absolute or relative. That gives concrete types like AbsoluteFilePath, RelativeDirectoryPath, and orientation-agnostic FilePath / DirectoryPath, all implementing a shared IPath interface hierarchy. You can hold mixed paths in a List<IPath> and filter by capability with OfType<IFilePath>().
Paths are canonicalized on creation (separators normalized, trailing separators trimmed), convert implicitly to string so they drop into any System.IO API, and compose with a / operator that returns the correctly-typed result.
Features
- Interface hierarchy:
IPathwithIFilePath,IDirectoryPath,IAbsolutePath,IRelativePath, and the four combinations (IAbsoluteFilePath,IAbsoluteDirectoryPath,IRelativeFilePath,IRelativeDirectoryPath). - Eight concrete path types:
AbsolutePath,RelativePath,FilePath,DirectoryPath,AbsoluteFilePath,AbsoluteDirectoryPath,RelativeFilePath,RelativeDirectoryPath. - Path decomposition:
FileName,FileExtension,FullFileExtension(for.tar.gz),DirectoryPath,FileNameWithoutExtension, plus theFileName/FileExtension/DirectoryNameprimitive value types. - Composition with
/:directory / relativePath,directory / FileName, and similar, each returning the right result type. - Absolute/relative conversions:
AsAbsolute(),AsAbsolute(baseDirectory), andAsRelative(baseDirectory). - Directory navigation:
Parent,Depth,IsRoot,GetAncestors(),IsChildOf,IsParentOf, and strongly-typedGetContents()enumeration. - Filesystem checks:
Exists,IsFile,IsDirectory. - Validation and canonicalization inherited from the semantic string framework, driven by path attributes such as
[IsAbsolutePath],[IsFileName], and[IsFileExtension].
Installation
Package Manager Console
Install-Package ktsu.Semantics.Paths
.NET CLI
dotnet add package ktsu.Semantics.Paths
Package Reference
<PackageReference Include="ktsu.Semantics.Paths" Version="x.y.z" />
Usage Examples
Basic Example
using ktsu.Semantics.Paths;
// Build paths with the typed factory, then compose with the '/' operator
AbsoluteDirectoryPath projectDir = AbsoluteDirectoryPath.Create(@"C:\repos\app");
RelativeFilePath rel = RelativeFilePath.Create(@"src\Program.cs");
AbsoluteFilePath source = projectDir / rel; // C:\repos\app\src\Program.cs
FileName name = source.FileName; // Program.cs
FileExtension ext = source.FileExtension; // .cs
AbsoluteDirectoryPath dir = source.AbsoluteDirectoryPath;
if (source.Exists)
{
// implicit conversion to string drops straight into System.IO
string text = System.IO.File.ReadAllText(source);
}
Absolute and relative conversions
using ktsu.Semantics.Paths;
AbsoluteDirectoryPath root = AbsoluteDirectoryPath.Create(@"C:\data");
AbsoluteFilePath file = AbsoluteFilePath.Create(@"C:\data\logs\app.log");
RelativeFilePath relative = file.AsRelative(root); // logs\app.log
AbsoluteFilePath backAgain = relative.AsAbsolute(root); // C:\data\logs\app.log
AbsoluteFilePath renamed = file.ChangeExtension(FileExtension.Create(".bak"));
bool nested = file.IsChildOf(root); // true
AsAbsolute() with no argument resolves a relative path against the current working directory. The baseDirectory overload of AsAbsolute exists on the relative path types only.
Polymorphic collections and typed enumeration
using ktsu.Semantics.Paths;
List<IPath> all =
[
AbsoluteFilePath.Create(@"C:\data.txt"),
RelativeDirectoryPath.Create(@"logs\app"),
FilePath.Create(@"document.pdf"),
];
List<IFilePath> files = all.OfType<IFilePath>().ToList();
List<IAbsolutePath> absolutes = all.OfType<IAbsolutePath>().ToList();
// GetContents() yields correctly-typed children
AbsoluteDirectoryPath project = AbsoluteDirectoryPath.Create(@"C:\project");
foreach (IPath entry in project.GetContents())
{
switch (entry)
{
case AbsoluteFilePath f:
Console.WriteLine($"file: {f.FileName} ({f.FileExtension})");
break;
case AbsoluteDirectoryPath d:
Console.WriteLine($"dir: {d.Name} at depth {d.Depth}");
break;
}
}
GetContents() returns an empty sequence rather than throwing when the directory is missing or access is denied.
API Reference
Interface hierarchy
| Interface | Extends | Notable member |
|---|---|---|
IPath |
(none) | marker |
IFilePath |
IPath |
AbsoluteFilePath AsAbsolute() |
IDirectoryPath |
IPath |
AsAbsolute(), IEnumerable<IPath> GetContents() |
IAbsolutePath |
IPath |
AbsolutePath AsAbsolute() |
IRelativePath |
IPath |
AbsolutePath AsAbsolute() |
IAbsoluteFilePath |
IFilePath, IAbsolutePath |
typed AsAbsolute() |
IAbsoluteDirectoryPath |
IDirectoryPath, IAbsolutePath |
typed AsAbsolute() |
IRelativeFilePath |
IFilePath, IRelativePath |
typed AsAbsolute() |
IRelativeDirectoryPath |
IDirectoryPath, IRelativePath |
typed AsAbsolute() |
Concrete types and creation
All concrete types are sealed records created through the inherited static factory Create(...) (accepting string, char[], or ReadOnlySpan<char>). Create throws ArgumentException on invalid input and ArgumentNullException on null.
| Type | Kind | Interface |
|---|---|---|
AbsolutePath |
untyped absolute | IAbsolutePath |
RelativePath |
untyped relative | IRelativePath |
FilePath |
orientation-agnostic file | IFilePath |
DirectoryPath |
orientation-agnostic directory | IDirectoryPath |
AbsoluteFilePath |
absolute file | IAbsoluteFilePath |
AbsoluteDirectoryPath |
absolute directory | IAbsoluteDirectoryPath |
RelativeFilePath |
relative file | IRelativeFilePath |
RelativeDirectoryPath |
relative directory | IRelativeDirectoryPath |
The primitive component types FileName, FileExtension, and DirectoryName are semantic strings in their own right.
Common members
| Name | Type | Description |
|---|---|---|
Exists |
bool |
True if the path is an existing file or directory. |
IsFile / IsDirectory |
bool |
Filesystem-backed checks. |
FileName |
FileName |
Filename portion (file paths). |
FileExtension / FullFileExtension |
FileExtension |
Last extension / everything from the first dot. |
DirectoryPath |
DirectoryPath |
Directory portion of a file path. |
Parent / Name / Depth / IsRoot |
directory members | Directory navigation. |
AsAbsolute() |
typed absolute path | Resolve against the current working directory. |
AsAbsolute(AbsoluteDirectoryPath) |
typed absolute path | Resolve a relative path against a base (relative types only). |
AsRelative(AbsoluteDirectoryPath) |
typed relative path | Make relative to a base directory. |
GetContents() |
IEnumerable<IPath> |
Strongly-typed directory children. |
operator / |
typed result | Combine a directory with a relative path, FileName, or DirectoryName. |
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 was computed. 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.Semantics.Strings (>= 2.5.1)
- Microsoft.Bcl.AsyncInterfaces (>= 10.0.9)
- System.Memory (>= 4.6.3)
-
.NETStandard 2.1
- ktsu.Semantics.Strings (>= 2.5.1)
-
net10.0
- ktsu.Semantics.Strings (>= 2.5.1)
-
net8.0
- ktsu.Semantics.Strings (>= 2.5.1)
-
net9.0
- ktsu.Semantics.Strings (>= 2.5.1)
NuGet packages (5)
Showing the top 5 NuGet packages that depend on ktsu.Semantics.Paths:
| Package | Downloads |
|---|---|
|
ktsu.AppDataStorage
A .NET library for persistent application data storage using JSON serialization. Provides a simple inherit-and-use pattern with automatic file management, thread-safe operations, debounced saves, backup recovery, and singleton access. Stores data in the user's app data folder with support for custom subdirectories and file names. |
|
|
ktsu.SingleAppInstance
A lightweight .NET library that ensures only one instance of an application is running at a time. Uses a JSON-serialized PID file with multi-attribute process verification (PID, name, start time, executable path) for accurate instance detection, built-in race condition handling for simultaneous startups, and backward compatibility with legacy PID formats. Supports .NET 10.0 through .NET Standard 2.0. |
|
|
ktsu.ImGui.Popups
A professional library for modal dialogs and popup components in ImGui.NET, providing message boxes, input prompts with validation (string, int, float), searchable selection lists with type-safe generics, and an advanced filesystem browser with open/save modes, directory navigation, and pattern filtering support. |
|
|
ktsu.ImGui.App
A comprehensive .NET library that provides complete application scaffolding for Dear ImGui applications, featuring window management, DPI-aware rendering, precision PID-controlled frame limiting with comprehensive auto-tuning, advanced font handling with Unicode/emoji support, texture management, and debug tooling. Built on Silk.NET for cross-platform OpenGL support and Hexa.NET.ImGui for modern Dear ImGui bindings. |
|
|
ktsu.Schema
Schema |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.5.1 | 0 | 7/2/2026 |
| 2.5.0 | 111 | 7/1/2026 |
| 2.4.0 | 136 | 7/1/2026 |
| 2.3.1 | 112 | 6/30/2026 |
| 2.3.0 | 429 | 6/29/2026 |
| 2.2.0 | 224 | 6/28/2026 |
| 2.1.0 | 115 | 6/28/2026 |
| 2.0.2 | 106 | 6/28/2026 |
| 2.0.1 | 122 | 6/27/2026 |
| 1.1.3 | 605 | 6/25/2026 |
| 1.1.2 | 391 | 6/21/2026 |
| 1.1.1 | 882 | 6/12/2026 |
| 1.1.0 | 275 | 6/12/2026 |
| 1.0.35 | 5,642 | 3/2/2026 |
| 1.0.34 | 309 | 2/27/2026 |
| 1.0.33 | 408 | 2/25/2026 |
| 1.0.32 | 378 | 2/23/2026 |
| 1.0.31 | 678 | 2/17/2026 |
| 1.0.31-pre.1 | 77 | 2/16/2026 |
| 1.0.30 | 209 | 2/10/2026 |
## v2.5.1 (patch)
Changes since v2.5.0:
- fix(music): use ValueTuple.GetHashCode instead of System.HashCode for netstandard2.0 compatibility ([@matt-edmondson](https://github.com/matt-edmondson))
- refactor(music): split Progression.TryParse into helpers to cut cognitive complexity and remove always-true check (SonarQube S3776/S2583) ([@matt-edmondson](https://github.com/matt-edmondson))
- docs(music): update examples and references for Parse/TryParse rename and chart-style progressions ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): chart-style Arrangement ToString + Parse/TryParse + structural equality ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): chart-style Section ToString + Parse/TryParse ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music)!: replace bar-delimited Progression.Parse with chart-style ToString/Parse/TryParse + structural equality; migrate call sites ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): rename Form.FromPattern to Parse/TryParse, canonical ToString, structural equality ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): Rest canonical ToString + Parse/TryParse ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): Note canonical ToString + Parse/TryParse ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): ChordEvent canonical ToString + Parse/TryParse ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): canonical Chord ToString, TryParse, ParseRoot via Notation ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): Key canonical ToString + Parse/TryParse; roman-numeral accidental via Notation ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): Scale canonical ToString + Parse/TryParse ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): Tempo canonical ToString + Parse/TryParse ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): Velocity canonical ToString + Parse/TryParse ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): TimeSignature canonical ToString + Parse/TryParse ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): Duration canonical ToString + Parse/TryParse ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): Interval canonical ToString + Parse/TryParse ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): rename Mode.FromName to Parse/TryParse, canonical ToString ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): typed Pitch factory, rename FromName to Parse/TryParse, canonical ToString ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): typed PitchClass factory, Parse/TryParse, canonical ToString ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add NoteLetter and Accidental enums ([@matt-edmondson](https://github.com/matt-edmondson))
- docs: implementation plan for music type-safe factories and canonical round-trip ToString ([@matt-edmondson](https://github.com/matt-edmondson))
- docs: revise music factories spec with canonical round-trip ToString and chart-style aggregate format ([@matt-edmondson](https://github.com/matt-edmondson))
- docs: design spec for music type-safe factories and Parse/TryParse convention ([@matt-edmondson](https://github.com/matt-edmondson))
- [patch] docs: add per-package READMEs and turn root README into a family index ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.5.0 (minor)
Changes since v2.4.0:
- docs(music): document the analysis aggregate layer ([@matt-edmondson](https://github.com/matt-edmondson))
- test(music): lock guard/coverage contracts; dedupe chromatic scale check ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add Form pattern extraction and named-form recognition ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add Arrangement container ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add Section structural unit ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add chromatic chord identification ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add key inference by diatonic fit ([@matt-edmondson](https://github.com/matt-edmondson))
- docs(music): switch key inference to quality-weighted scoring ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add cadence detection ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add roman-numeral labeling and functional classification ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add Progression.Parse bar-delimited chord syntax ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add Progression core (construction, totals, empty rejection) ([@matt-edmondson](https://github.com/matt-edmondson))
- fix(music): drop CA1859 pragma; use IMusicalEvent helper in ChordEvent test ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add ChordEvent harmonic event type ([@matt-edmondson](https://github.com/matt-edmondson))
- docs(music): implementation plan for analysis aggregate layer ([@matt-edmondson](https://github.com/matt-edmondson))
- docs(music): design spec for analysis aggregate layer ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.4.0 (minor)
Changes since v2.3.0:
- test(strings): add As<T> round-trip test for Uuid ([@matt-edmondson](https://github.com/matt-edmondson))
- docs(strings): reconcile spec As<T> test bullet with implemented roster ([@matt-edmondson](https://github.com/matt-edmondson))
- docs(strings): document Identifiers package in README ([@matt-edmondson](https://github.com/matt-edmondson))
- chore(strings): finalize Identifiers package and document it ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(strings): add JwtToken identifier type ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(strings): add Iban identifier type ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(strings): add Isbn identifier type ([@matt-edmondson](https://github.com/matt-edmondson))
- style(strings): add trailing newline to IsCreditCardNumberAttribute.cs ([@matt-edmondson](https://github.com/matt-edmondson))
- docs(strings): use pattern-matching form in Tasks 5-6 (IDE0078) ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(strings): add CreditCardNumber identifier type ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(strings): add Ulid identifier type ([@matt-edmondson](https://github.com/matt-edmondson))
- docs(strings): align plan Tasks 3-7 with repo conventions (ThrowsExactly, no using System, Ensure.NotNull) ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(strings): add Uuid identifier type ([@matt-edmondson](https://github.com/matt-edmondson))
- chore(strings): scaffold Semantics.Strings.Identifiers package ([@matt-edmondson](https://github.com/matt-edmondson))
- docs(strings): correct empty-string handling in spec; add implementation plan ([@matt-edmondson](https://github.com/matt-edmondson))
- docs(strings): spec for Semantics.Strings.Identifiers (Phase 0) ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.3.1 (patch)
Changes since v2.3.0:
- Bump the system group with 1 update ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump the ktsu group with 10 updates ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v2.3.0 (minor)
Changes since v2.2.0:
- docs(color): correct Oklab round-trip tolerance note in plan ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(color): add NamedColors and gamma-regression tests ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(color): add Oklab mix, lerp, distance, and gradient ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(color): add WCAG luminance, contrast, and accessibility adjustment ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(color): add HSL and HSV conversions ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(color): add Oklab and Oklch perceptual spaces ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(color): add hex and byte conversions (sRGB-interpreted) ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(color): add Srgb space and gamma-correct sRGB<->linear boundary ([@matt-edmondson](https://github.com/matt-edmondson))
- docs(color): add semantic-domains roadmap, Semantics.Color spec and plan ([@matt-edmondson](https://github.com/matt-edmondson))
- style(color): strip UTF-8 BOM and add final newline (editorconfig) ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(color): scaffold Semantics.Color with canonical linear Color type ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.2.0 (minor)
Changes since v2.1.0:
- docs: cover Semantics.Music score primitives, frequency, inversions, roman parsing ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] feat(music): score primitives, frequency bridge, inversions/transpose, roman-numeral parsing ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): parse roman numerals back into chords (inverse of RomanNumeralOf) ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add chord inversions and Transpose on Chord/Scale/Key ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add Pitch<->frequency (A440) and interval cents ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add score primitives (Velocity, Tempo, Note, Rest) with real-time conversion ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.1.0 (minor)
Changes since v2.0.0:
- Merge feature/semantics-music-types: musical value types ([@matt-edmondson](https://github.com/matt-edmondson))
- [minor] feat(music): musical value types (pitch, interval, scale, chord, key, duration) ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add Key with roman-numeral function; spell chromatic degrees conventionally (flat-preference) ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add Chord engine with parsing, tones, and voicing (full HeatDeathRomance vocabulary) ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add TimeSignature with bar and beat durations ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add rational Duration with arithmetic and dotted/tuplet support ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add Scale and ScaleDegree with degree resolution ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add Mode with full standard scale catalog (diatonic, jazz, symmetric, pentatonic) ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add Interval with octave folding and pitch difference ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): add Pitch with MIDI/name conversion and transpose ([@matt-edmondson](https://github.com/matt-edmondson))
- feat(music): scaffold Semantics.Music with PitchClass ([@matt-edmondson](https://github.com/matt-edmondson))
- fix(packaging): unblock the 2.0 release pipeline [patch] ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.0.2 (patch)
Changes since v2.0.1:
- Sync global.json ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v2.0.1 (patch)
Changes since v2.0.0:
- fix(packaging): unblock the 2.0 release pipeline [patch] ([@matt-edmondson](https://github.com/matt-edmondson))
## v2.0.0 (major)
Changes since v1.0.0:
- Revert "Update pack supressions" ([@matt-edmondson](https://github.com/matt-edmondson))
- Update pack supressions ([@matt-edmondson](https://github.com/matt-edmondson))
- release: ktsu.Semantics 2.0.0 — unified vector quantities [major] ([@matt-edmondson](https://github.com/matt-edmondson))
- fix: drop unreferenced SourceLink package versions (KTSU0005 under ktsu.Sdk 2.11.0) ([@matt-edmondson](https://github.com/matt-edmondson))
- fix: restore icon.png as LFS pointer after main merge ([@matt-edmondson](https://github.com/matt-edmondson))
- Merge remote-tracking branch 'origin/main' into vectors ([@matt-edmondson](https://github.com/matt-edmondson))
- fix(generator): annotate nullable referenceExpr to clear CS8600 ([@matt-edmondson](https://github.com/matt-edmondson))
- docs: reflect 2.0 state, rebrand to 'semantic quantities', document alias packages ([@matt-edmondson](https://github.com/matt-edmondson))
- feat: storage-type alias packages for ktsu.Semantics.Quantities ([@matt-edmondson](https://github.com/matt-edmondson))
- chore: sync stale Units.g.cs and add generated-files CI guard ([@matt-edmondson](https://github.com/matt-edmondson))
- fix: close V0 release blockers and drop out-of-support TFMs ([@matt-edmondson](https://github.com/matt-edmondson))
- fix(build): make vectors build under .NET 10 SDK ([@matt-edmondson](https://github.com/matt-edmondson))
- Merge remote-tracking branch 'origin/main' into vectors-merge-trial ([@matt-edmondson](https://github.com/matt-edmondson))
- Add System.Text.Json package reference to project files ([@matt-edmondson](https://github.com/matt-edmondson))
- Update ktsu.Sdk versions to 2.10.2 ([@matt-edmondson](https://github.com/matt-edmondson))
- Update ktsu.Sdk versions to 2.10.1 ([@matt-edmondson](https://github.com/matt-edmondson))
- refactor(generator): use singular-lemma factory names, drop factoryName ([@Claude](https://github.com/Claude))
- docs: log scales are metadata-generated; Percent/Gain convergence ([@Claude](https://github.com/Claude))
- refactor(quantities): converge log scales and audio types on metadata ([@Claude](https://github.com/Claude))
- feat(generator): LogarithmicScalesGenerator — log scales from logarithmic.json ([@Claude](https://github.com/Claude))
- refactor(quantities): align audio-engineering types with the vectors branch ([@Claude](https://github.com/Claude))
- docs: add 1.x → 2.0 migration guide ([@Claude](https://github.com/Claude))
- test(quantities): cover backfilled dimensions and log-scale companions ([@Claude](https://github.com/Claude))
- feat(quantities): hand-written logarithmic-scale companions ([@Claude](https://github.com/Claude))
- feat(quantities): backfill missing dimensions and acoustic overloads from main ([@Claude](https://github.com/Claude))
- Update NuGet package versions in Directory.Packages.props ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix IDE0370 build errors from .NET 10 SDK analyzer ([@Claude](https://github.com/Claude))
- feat(quantities): backfill unit catalog and constants domains from main ([@Claude](https://github.com/Claude))
- fix(generator): materialise Generic constants via PreciseNumber.To<T>() ([@Claude](https://github.com/Claude))
- chore: refresh generated snapshots ([@Claude](https://github.com/Claude))
- feat(generator): declare Frequency x Length = Velocity wave relationship ([@Claude](https://github.com/Claude))
- fix(quantities): add comparison operators to PhysicalQuantity (CA1036) ([@Claude](https://github.com/Claude))
- Merge remote-tracking branch 'origin/main' into claude/vectors-sync-progress-ofoith ([@Claude](https://github.com/Claude))
- Add audio-engineering quantities and normalized parameter tapers ([@Claude](https://github.com/Claude))
- chore: drop unnecessary null-forgiving operators + silence coverage warning ([@Claude](https://github.com/Claude))
- feat(quantities): canonical IPhysicalQuantity surface + typed In() (closes #59) ([@Claude](https://github.com/Claude))
- docs(architecture): document physics generator pipeline (closes #61) ([@Claude](https://github.com/Claude))
- feat(generator): SEM004 — flag dimensions.json units missing from units.json ([@Claude](https://github.com/Claude))
- docs: fix stale README + guides — plural factories, V3 object-init, real PhysicalConstants surface ([@Claude](https://github.com/Claude))
- feat(quantities): per-overload physicalConstraints + EnsurePositive guard (closes #51) ([@Claude](https://github.com/Claude))
- test(quantities): generator-output invariants — no duplicate signatures, commutative * (closes #57) ([@Claude](https://github.com/Claude))
- feat(generator): SEM003 diagnostic + form-specific relationships (closes #58) ([@Claude](https://github.com/Claude))
- feat(generator): plural From{Unit} factory naming + form matrix docs (closes #49) ([@Claude](https://github.com/Claude))
- Merge vectors (post #70) into rebase-issue-48: combine multi-unit factories with SEM002 + AnalyzerReleases ([@Claude](https://github.com/Claude))
- Merge vectors into work/issue-48: combine multi-unit factories with V0 non-negativity ([@Claude](https://github.com/Claude))
- feat(generator): add SEM002 metadata validation; refresh stale generator output ([@Claude](https://github.com/Claude))
- Merge remote-tracking branch 'origin/vectors' into work/issue-48 ([@Claude](https://github.com/Claude))
- feat(quantities): enforce V0 non-negativity and absolute V0-V0 subtraction ([@Claude](https://github.com/Claude))
- feat(generator): emit From{Unit} factory for every availableUnit ([@Claude](https://github.com/Claude))
- test: cover IVector*/Magnitude/Dot/Cross and overload conversions ([@Claude](https://github.com/Claude))
- feat(generator): emit SEM001 when relationship references unknown dimension ([@Claude](https://github.com/Claude))
- Pass 2: drop main-imported tests that reference removed hand-written types ([@Claude](https://github.com/Claude))
- Merge main into vectors (structural reconciliation) ([@Claude](https://github.com/Claude))
- docs: align docs with unified vector model and current API ([@Claude](https://github.com/Claude))
- feat: Add new skill for creating physics quantity types with metadata-driven process ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance project configuration: enable compiler-generated files and set output path; remove specific generated files from compilation ([@matt-edmondson](https://github.com/matt-edmondson))
- feat: Add new unit categories and conversion factors for fluid mechanics and chemistry ([@matt-edmondson](https://github.com/matt-edmondson))
- feat: Enhance dimensions and units metadata with additional overloads and derived units ([@matt-edmondson](https://github.com/matt-edmondson))
- feat: Update CodeBlocker package version and refactor scope usage in generators and templates ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor dimensions metadata structure and enhance vector form definitions ([@matt-edmondson](https://github.com/matt-edmondson))
- feat: Update dimensions.json schema to unify vector representation and enhance dimensional relationships ([@matt-edmondson](https://github.com/matt-edmondson))
- feat: Enhance cross-dimensional operations and relationships in unified vector representation ([@matt-edmondson](https://github.com/matt-edmondson))
- feat: Define proposed base types and naming patterns for unified vector representation of quantities ([@matt-edmondson](https://github.com/matt-edmondson))
- feat: Add strategy document for unified vector representation of quantities ([@matt-edmondson](https://github.com/matt-edmondson))
- refactor: Simplify vector method implementations by removing unnecessary scope blocks ([@matt-edmondson](https://github.com/matt-edmondson))
- feat: Implement QuantitiesGenerator for generating scalar and vector quantity types from dimensions.json ([@matt-edmondson](https://github.com/matt-edmondson))
- refactor: Remove unused using directives for ktsu.Semantics.Strings in test files ([@matt-edmondson](https://github.com/matt-edmondson))
- feat: Add Microsoft.Bcl.AsyncInterfaces package and refactor path handling ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove obsolete validation attributes and related files for path and text validation ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove .cursorindexingignore to eliminate unnecessary indexing rules ([@matt-edmondson](https://github.com/matt-edmondson))
- Update project file to target .NET 10.0 and remove obsolete configurations ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove legacy build scripts ([@matt-edmondson](https://github.com/matt-edmondson))
- Add ktsu.RoundTripStringJsonConverter package reference and update SemanticString to use its JsonConverter ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor validation strategy null checks to use Ensure.NotNull for consistency ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance test assertions with descriptive messages for clarity ([@matt-edmondson](https://github.com/matt-edmondson))
- Update suppression targets in CompatibilitySuppressions.xml for attribute consistency ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove unnecessary blank line in PerformanceRegressionTests class ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove performance variance checks from quantity creation test for consistency ([@matt-edmondson](https://github.com/matt-edmondson))
- Update .NET version to 10.0 and adjust coverage reporting for SonarQube integration ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor validation attributes and update path-related records for consistency ([@matt-edmondson](https://github.com/matt-edmondson))
- Update System.Memory package version to 4.6.3 ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor null checks to use Ensure instead of Guard; update target frameworks and package references ([@matt-edmondson](https://github.com/matt-edmondson))
- Increase performance variance threshold in regression tests to 70% for CI environment consistency ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove Polyfill package references and update test assertions for clarity ([@matt-edmondson](https://github.com/matt-edmondson))
- Add DirectoryName type and improve path validation semantics ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance project detection logic to support multi-project solutions ([@matt-edmondson](https://github.com/matt-edmondson))
- Add compatibility supression files ([@matt-edmondson](https://github.com/matt-edmondson))
- Modernize codebase and simplify multi-framework support ([@matt-edmondson](https://github.com/matt-edmondson))
- Update project configurations and SDK versions ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor testing and coverage configuration ([@matt-edmondson](https://github.com/matt-edmondson))
- Add unit tests for AcousticOperator and PhysicalDimension extensions ([@matt-edmondson](https://github.com/matt-edmondson))
- Update Invoke-DotNetTest function to remove unnecessary `--no-build` flag from dotnet test command for improved test execution. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add unit tests for AcousticImpedance, ReflectionCoefficient, and SoundSpeed classes ([@matt-edmondson](https://github.com/matt-edmondson))
- Add unit tests for AcousticDirectionalityIndex functionality ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove obsolete cursor ignore files to streamline project structure ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor Exposure calculations to use CoulombPerKilogram unit ([@matt-edmondson](https://github.com/matt-edmondson))
- Add unit tests for various SemanticString validators ([@matt-edmondson](https://github.com/matt-edmondson))
- Add unit tests for casing and line count validators in SemanticString ([@matt-edmondson](https://github.com/matt-edmondson))
- Add unit tests for Casing and Contracts validation in SemanticString ([@matt-edmondson](https://github.com/matt-edmondson))
- Update RegexMatchAttribute to include a timeout in Regex matching for improved performance and reliability. This change ensures that the regex operation does not hang indefinitely by setting a one-second timeout, enhancing the overall validation process. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor SemanticDirectoryPath class to improve content retrieval method naming and enhance error handling. The `Contents` property has been renamed to `GetContents` for clarity, and synchronous handling has been implemented to ensure compatibility with older .NET versions. ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix argument exception message assertion in SemanticStringAdditionalTests for improved clarity ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove obsolete files and clean up project structure ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance validation error messages in ContainsAttribute, EndsWithAttribute, and StartsWithAttribute classes ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor PhysicalDimensions class to use IReadOnlySet for standard physical dimensions and update test classes to static for consistency. This improves clarity and aligns with coding standards across the project. ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove unnecessary using directives from test files for improved clarity ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor directory path content retrieval methods for consistency and clarity ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix missing usings ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor path handling code for improved readability and consistency ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor directory path implementations to support synchronous enumeration for older .NET versions ([@matt-edmondson](https://github.com/matt-edmondson))
- Add System.Memory package and implement path polyfills for .NET compatibility ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance null argument validation in RelativeFilePath for .NET compatibility ([@matt-edmondson](https://github.com/matt-edmondson))
- Implement polyfill for ArgumentNullException in path classes for compatibility ([@matt-edmondson](https://github.com/matt-edmondson))
- Add path-related polyfills and refactor namespaces for clarity ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor SemanticString methods to utilize WeakString for span-based operations ([@matt-edmondson](https://github.com/matt-edmondson))
- Update project configuration and refine string handling methods ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance semantic string handling with read-only span support ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor validation framework and introduce new path semantics ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor validation attributes to enhance initialization and validation logic ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor validation attributes to remove FluentValidation dependency ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor project structure and update SDK versions ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor project configuration and enhance SDK management ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance project configuration and code generation capabilities ([@matt-edmondson](https://github.com/matt-edmondson))
- Code generation ([@matt-edmondson](https://github.com/matt-edmondson))
- Add new static factory methods for length and position quantities in micrometers, nanometers, and various vector dimensions ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance quantity classes with additional static factory methods for creating instances from nanometers and molar concentrations ([@matt-edmondson](https://github.com/matt-edmondson))
- Implement static factory methods for float quantity classes across various domains ([@matt-edmondson](https://github.com/matt-edmondson))
- Add extension methods for double and float physical quantities ([@matt-edmondson](https://github.com/matt-edmondson))
- Implement static factory methods for quantity classes in acoustic, chemical, electrical, fluid dynamics, mechanics, nuclear, optical, and thermal domains ([@matt-edmondson](https://github.com/matt-edmondson))
- Add new quantity classes and methods for acoustic, chemical, electrical, fluid dynamics, mechanics, nuclear, optical, and thermal domains ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor and enhance quantity classes and tests ([@matt-edmondson](https://github.com/matt-edmondson))
- Update package versions and enhance build scripts ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor exception assertions in unit tests for consistency ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor performance regression tests to set CI-friendly targets ([@matt-edmondson](https://github.com/matt-edmondson))
- Update package versions and refine project metadata ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance path handling and testing for directory and file combinations ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance semantic string type conversions and path handling ([@matt-edmondson](https://github.com/matt-edmondson))
- Update copyright notice, package versions, and enhance winget manifest generation script ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance performance regression tests with updated targets and optimizations ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove BenchmarkMemoryAllocation Test Due to Incompatibility ([@matt-edmondson](https://github.com/matt-edmondson))
- Optimize Performance Benchmarks to Reduce Memory Allocation ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance Performance Benchmarks and Derived Cursor Rules ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance Derived Cursor Rules with Additional Validation Guidelines ([@matt-edmondson](https://github.com/matt-edmondson))
- Update project files and dependencies for improved functionality and consistency ([@matt-edmondson](https://github.com/matt-edmondson))
- Update TAGS.md to Use Spaces for Multi-Word Tags ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance DESCRIPTION and README for Improved Clarity and Detail ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor Bootstrap Units into Separate Class for Improved Organization ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove outdated TODO comments for various scientific domains in Units.cs to streamline the codebase and improve maintainability. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add derived constants validation tests for PhysicalConstants ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor Units and PhysicalConstants for Consistency and Maintainability ([@matt-edmondson](https://github.com/matt-edmondson))
- Standardize documentation styles and enhance performance benchmarks in the Semantics library. This update includes the migration of hardcoded constants to the PhysicalConstants class, ensuring all constants are accessed through generic getters. Additionally, it refines the performance benchmarks to utilize these constants, improving code clarity and maintainability. The integration tests have also been updated to reflect these changes, ensuring accurate calculations across various domains. ([@matt-edmondson](https://github.com/matt-edmondson))
- Standardize documentation styles for physics quantities and enhance integration tests. This update introduces explicit XML documentation formats for dimension properties and constructors, improving clarity and consistency. Additionally, it refines advanced integration tests to ensure accurate cross-domain calculations, further solidifying the library's robustness for scientific applications. ([@matt-edmondson](https://github.com/matt-edmondson))
- Implement comprehensive enhancements to the ktsu.Semantics library, including standardized documentation for all physics quantities, improved testing strategies with advanced integration and performance regression tests, and the addition of real-world physics examples. This update significantly enhances code consistency, documentation clarity, and testing robustness, establishing a solid foundation for future development and ensuring a professional-grade solution for type-safe physics calculations in .NET applications. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance the Semantics library by completing the implementation of the Physics Quantities System, which now includes 80+ quantities across 8 scientific domains. Update the README.md and documentation to reflect the comprehensive capabilities, including type-safe arithmetic, automatic unit conversions, and centralized physical constants. Introduce integration and performance benchmarks to validate cross-domain calculations and ensure efficient operations. This update significantly improves the library's usability and functionality for scientific computing and engineering applications. ([@matt-edmondson](https://github.com/matt-edmondson))
- Add validation tests for derived physical constants in PhysicalConstantsTests.cs ([@matt-edmondson](https://github.com/matt-edmondson))
- Add comprehensive tests for physical constants validation in PhysicalConstantsTests.cs ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor operator overloads in the Semantics library to resolve ambiguities between work/energy and torque calculations. Update the Force and Length operators, replacing the removed method with an explicit CalculateTorque method. Enhance documentation and ensure compliance with coding standards. This update improves clarity and usability for physical quantity calculations in .NET applications. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor physics relationship calculations in the Semantics library to resolve operator ambiguities and enhance clarity. Update the Force and Length operators to distinguish between work/energy and torque calculations, introducing explicit methods for torque. Clean up unused variables and improve documentation for better usability. This update strengthens the library's framework for accurate physical quantity calculations in .NET applications. ([@matt-edmondson](https://github.com/matt-edmondson))
- Implement additional physical relationships in the Semantics library, focusing on the Acoustic, Chemical, and Fluid Dynamics domains. Introduce operator overloads for calculating acoustic impedance from density and sound speed, photon energy from frequency, and apply the ideal gas law for amount of substance calculations. Update existing quantities to enhance usability and ensure adherence to coding standards with comprehensive XML documentation. This update... (truncated due to NuGet length limits)