From b464d897af67e7b25dfcbfc1734126613d5c2a37 Mon Sep 17 00:00:00 2001 From: "codebelt-aicia[bot]" Date: Fri, 5 Jun 2026 11:21:33 +0000 Subject: [PATCH 1/8] V10.1.4/service update --- .../PackageReleaseNotes.txt | 6 +++ .../PackageReleaseNotes.txt | 6 +++ .../PackageReleaseNotes.txt | 6 +++ .../PackageReleaseNotes.txt | 6 +++ CHANGELOG.md | 4 ++ Directory.Packages.props | 50 +++++++++---------- 6 files changed, 53 insertions(+), 25 deletions(-) diff --git a/.nuget/Codebelt.Extensions.AspNetCore.Mvc.Formatters.Text.Yaml/PackageReleaseNotes.txt b/.nuget/Codebelt.Extensions.AspNetCore.Mvc.Formatters.Text.Yaml/PackageReleaseNotes.txt index 153d217..0ee2c57 100644 --- a/.nuget/Codebelt.Extensions.AspNetCore.Mvc.Formatters.Text.Yaml/PackageReleaseNotes.txt +++ b/.nuget/Codebelt.Extensions.AspNetCore.Mvc.Formatters.Text.Yaml/PackageReleaseNotes.txt @@ -1,3 +1,9 @@ +Version: 10.1.4 +Availability: .NET 10 and .NET 9 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.1.3 Availability: .NET 10 and .NET 9 diff --git a/.nuget/Codebelt.Extensions.AspNetCore.Text.Yaml/PackageReleaseNotes.txt b/.nuget/Codebelt.Extensions.AspNetCore.Text.Yaml/PackageReleaseNotes.txt index 64fbb7b..43392d6 100644 --- a/.nuget/Codebelt.Extensions.AspNetCore.Text.Yaml/PackageReleaseNotes.txt +++ b/.nuget/Codebelt.Extensions.AspNetCore.Text.Yaml/PackageReleaseNotes.txt @@ -1,3 +1,9 @@ +Version: 10.1.4 +Availability: .NET 10 and .NET 9 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.1.3 Availability: .NET 10 and .NET 9 diff --git a/.nuget/Codebelt.Extensions.YamlDotNet.App/PackageReleaseNotes.txt b/.nuget/Codebelt.Extensions.YamlDotNet.App/PackageReleaseNotes.txt index fe2e9d8..7eeca48 100644 --- a/.nuget/Codebelt.Extensions.YamlDotNet.App/PackageReleaseNotes.txt +++ b/.nuget/Codebelt.Extensions.YamlDotNet.App/PackageReleaseNotes.txt @@ -1,3 +1,9 @@ +Version: 10.1.4 +Availability: .NET 10 and .NET 9 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.1.3 Availability: .NET 10 and .NET 9 diff --git a/.nuget/Codebelt.Extensions.YamlDotNet/PackageReleaseNotes.txt b/.nuget/Codebelt.Extensions.YamlDotNet/PackageReleaseNotes.txt index 2fbfae7..abe7bf9 100644 --- a/.nuget/Codebelt.Extensions.YamlDotNet/PackageReleaseNotes.txt +++ b/.nuget/Codebelt.Extensions.YamlDotNet/PackageReleaseNotes.txt @@ -1,3 +1,9 @@ +Version: 10.1.4 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.1.3 Availability: .NET 10, .NET 9 and .NET Standard 2.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index a8c3001..12c5cba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ For more details, please refer to `PackageReleaseNotes.txt` on a per assembly ba > [!NOTE] > Changelog entries prior to version 8.4.0 was migrated from previous versions of `Cuemon.Extensions.YamlDotNet`, `Cuemon.Extensions.AspNetCore`, `Cuemon.Extensions.AspNetCore.Mvc` and `Cuemon.Extensions.Diagnostics`. +## [10.1.4] - 2026-06-05 + +This is a service update that focuses on package dependencies. + ## [10.1.3] - 2026-05-23 This is a service update that focuses on package dependencies, including a major upgrade to YamlDotNet that may impact consumers with custom type inspectors. diff --git a/Directory.Packages.props b/Directory.Packages.props index fd3d7b9..e8f96c6 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,26 +1,26 @@ - - - true - - - - - - - - - - - - - - - - - - - - - - + + + true + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 938beea0db256acaf4ed6cce181ab7475f4b93ad Mon Sep 17 00:00:00 2001 From: "aicia[bot]" Date: Sat, 6 Jun 2026 01:46:35 +0200 Subject: [PATCH 2/8] =?UTF-8?q?=F0=9F=92=AC=20add=20AGENTS.md=20with=20com?= =?UTF-8?q?prehensive=20repository=20guidance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Provides foundational guidance for AI agents working in this repository, including project overview, coding standards, project structure, test conventions, build configuration, and git operations safeguards. --- AGENTS.md | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 AGENTS.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..5dd82bf --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,73 @@ +# Agent Instructions for Codebelt.Extensions.YamlDotNet + +This document provides guidance for AI agents working in this repository. + +## Project Overview + +Codebelt.Extensions.YamlDotNet is a suite of .NET libraries providing uniform, opinionated, and extensible APIs for working with YamlDotNet. The solution targets .NET 10.0, .NET 9.0, and .NET Standard 2.0. It includes: + +- **Codebelt.Extensions.YamlDotNet** — Core extensions for YAML serialization, dynamic contracts, and converters. +- **Codebelt.Extensions.AspNetCore.Text.Yaml** — ASP.NET Core integration with bootstrapping and dependency injection support. +- **Codebelt.Extensions.AspNetCore.Mvc.Formatters.Text.Yaml** — ASP.NET Core MVC input/output formatters with YAML serialization. + +## Coding Standards + +- **Text encoding:** UTF-8 for text files (enforced via `.editorconfig`) +- **Template rewrites:** Preserve UTF-8 explicitly when scripts or tools rewrite text files; avoid locale-dependent encoding defaults +- **Namespaces:** File-scoped namespaces are required (enforced via `.editorconfig`) +- **Top-level statements:** Not allowed (enforced via `.editorconfig`) +- **Language version:** Always use the latest C# features (`LangVersion=latest`) +- **Nullable:** Enable nullable reference types in all new code +- **XML documentation:** All public APIs must have XML documentation comments +- **Testing:** Use xUnit v3 with Codebelt.Extensions.Xunit.App base classes + +## Project Structure + +- `src/` — Production source code + - `Codebelt.Extensions.YamlDotNet/` — Core YAML extensions + - `Codebelt.Extensions.AspNetCore.Text.Yaml/` — ASP.NET Core integration + - `Codebelt.Extensions.AspNetCore.Mvc.Formatters.Text.Yaml/` — ASP.NET Core MVC formatters + - `Codebelt.Extensions.YamlDotNet.App/` — Application-level tooling and utilities +- `test/` — Unit and integration tests (project names end with `Tests`) +- `.nuget/` — Per-package NuGet metadata (icon, README, release notes) +- `.docfx/` — DocFX documentation configuration +- `.github/` — CI/CD workflows, contributing guidelines, Copilot instructions + +## Test Conventions + +- Test project names must end with `Tests` (e.g., `{PROJECT_NAME}.Tests`) +- Test classes should inherit from the `Test` base class in `Codebelt.Extensions.Xunit` +- Use `Microsoft.Testing.Platform` as the test runner (`UseMicrosoftTestingPlatformRunner=true`) +- All tests are executable (`OutputType=Exe`) +- Test namespaces must match the SUT namespace (System Under Test), without `.Tests` suffix +- See `.github/copilot-instructions.md` for detailed test writing guidelines + +## Build & CI + +- Centralized package versions via `Directory.Packages.props` +- Resolve new or updated `Directory.Packages.props` versions from NuGet.org and keep them on the latest stable listed releases +- Centralized build configuration via `Directory.Build.props` +- MinVer for semantic versioning from Git tags +- Strong-name signing is enabled in CI environments (`CI=true`) +- Keep `.github/dependabot.yml` enabled at the repo root so central NuGet package management stays current + +## .bot/ Folder + +If a `.bot/` folder exists at the root, it contains **confidential, local-only** working material for AI agents — product requirement documents (PRDs), design proposals, agentic loop state, and brainstorming outputs. This folder is gitignored and never committed. + +When starting creative or design work (new features, architecture decisions, PRD drafts), use the [brainstorming skill](https://skills.sh/obra/superpowers/brainstorming) and save outputs to `.bot/`. Only move finalized, non-confidential instructions into `AGENTS.md` or `.github/copilot-instructions.md`. + +## Git Operations Safeguards + +Agents must never automatically commit code changes or push to remote repositories. Both actions require explicit user approval: + +- **Commits**: Always request confirmation from the user before staging and committing code. Present a clear summary of the changes and wait for approval before executing the commit. +- **Remote Operations**: Do not push, pull, fetch, or interact with `origin` or any remote repository without explicit user instruction. These operations modify repository history and can cause data loss if performed unexpectedly. + +**Rationale:** Automatic commits can clutter history with incomplete work, temporary debugging code, or unintended changes. Unexpected remote operations risk overwriting or losing commits on shared branches. Always require explicit user approval before performing these actions. + +## Official Documentation + +- Public API conventions belong in `.docfx/api/namespaces/` and should be treated as the official documentation source for library behavior and naming vocabulary. +- When adding or renaming public APIs, update the relevant namespace page in `.docfx/api/namespaces/` if the change introduces or clarifies a convention. +- Keep internal reasoning, exploratory notes, and agent discussion out of DocFX pages; summarize only stable public guidance. From c0263087a3c2031d105f685c2ded06f4972e47f8 Mon Sep 17 00:00:00 2001 From: "aicia[bot]" Date: Sat, 6 Jun 2026 01:46:41 +0200 Subject: [PATCH 3/8] =?UTF-8?q?=F0=9F=99=88=20configure=20bot=20workspace?= =?UTF-8?q?=20folder=20in=20gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add .bot/ folder to gitignore for local-only AI agent ideation, PRDs, and agentic loop state. Preserves .bot/README.md for documentation reference. --- .gitignore | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b2d91bd..2c4c6f0 100644 --- a/.gitignore +++ b/.gitignore @@ -374,4 +374,8 @@ FodyWeavers.xsd *.code-workspace # Strong-Name Key -*.snk \ No newline at end of file +*.snk + +# Bot workspace (local-only AI agent ideation, PRDs, and agentic loop state) +.bot/* +!.bot/README.md \ No newline at end of file From aeb5061a46afc830decef718b2302b283f6eb190 Mon Sep 17 00:00:00 2001 From: "aicia[bot]" Date: Sat, 6 Jun 2026 01:46:46 +0200 Subject: [PATCH 4/8] =?UTF-8?q?=F0=9F=94=A7=20add=20macOS=20platform=20det?= =?UTF-8?q?ection=20to=20build=20system?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduces IsMacOS property in Directory.Build.props and updates test framework selection to include macOS alongside Linux, enabling the test matrix to build on macOS runners. --- Directory.Build.props | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index b9caaf9..c1dc133 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -3,6 +3,7 @@ $(MSBuildProjectName.EndsWith('Tests')) $([MSBuild]::IsOSPlatform('Linux')) + $([MSBuild]::IsOSPlatform('OSX')) $([MSBuild]::IsOSPlatform('Windows')) true false @@ -48,7 +49,7 @@ - + net10.0;net9.0 From 1be87d3edc2432d053929a19a567a152f3afb477 Mon Sep 17 00:00:00 2001 From: "aicia[bot]" Date: Sat, 6 Jun 2026 01:46:53 +0200 Subject: [PATCH 5/8] =?UTF-8?q?=F0=9F=91=B7=20add=20optional=20macOS=20tes?= =?UTF-8?q?t=20matrix=20to=20CI=20pipeline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds optional macOS testing with separate X64 and ARM64 architecture variants, gated via workflow_dispatch input. Introduces test_qualitygate job to consolidate test results and establish quality gates for downstream jobs (sonarcloud, codecov, codeql). --- .github/workflows/ci-pipeline.yml | 87 ++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci-pipeline.yml b/.github/workflows/ci-pipeline.yml index c1c7d3e..8bba33e 100644 --- a/.github/workflows/ci-pipeline.yml +++ b/.github/workflows/ci-pipeline.yml @@ -12,6 +12,10 @@ on: options: - Debug - Release + run_mac_tests: + type: boolean + description: Run the macOS test matrix despite the additional cost and runtime. + default: false permissions: contents: read @@ -21,6 +25,7 @@ jobs: name: initialize runs-on: ubuntu-24.04 outputs: + run-mac-tests: ${{ steps.vars.outputs.run-mac-tests }} run-privileged-jobs: ${{ steps.vars.outputs.run-privileged-jobs }} strong-name-key-filename: ${{ steps.vars.outputs.strong-name-key-filename }} build-switches: ${{ steps.vars.outputs.build-switches }} @@ -29,6 +34,12 @@ jobs: name: calculate workflow variables shell: bash run: | + if [[ "${{ github.event_name }}" == "workflow_dispatch" && "${{ inputs.run_mac_tests }}" == "true" ]]; then + echo "run-mac-tests=true" >> "$GITHUB_OUTPUT" + else + echo "run-mac-tests=false" >> "$GITHUB_OUTPUT" + fi + if [[ "${{ github.event_name }}" == "pull_request" && "${{ github.event.pull_request.head.repo.full_name }}" != "${{ github.repository }}" ]]; then echo "run-privileged-jobs=false" >> "$GITHUB_OUTPUT" echo "strong-name-key-filename=" >> "$GITHUB_OUTPUT" @@ -103,11 +114,73 @@ jobs: build: true # net48 requires projects to be built (and so does xunitv3) download-pattern: build-${{ matrix.configuration }}-${{ matrix.arch }} + test_mac: + if: ${{ needs.init.outputs.run-mac-tests == 'true' }} + name: call-test-mac + needs: [init, build] + strategy: + fail-fast: false + matrix: + arch: [X64, ARM64] + configuration: [Debug, Release] + uses: codebeltnet/jobs-dotnet-test/.github/workflows/default.yml@v3 + with: + runs-on: ${{ matrix.arch == 'ARM64' && 'macos-26' || 'macos-26-intel' }} + configuration: ${{ matrix.configuration }} + test-arguments: -- RunConfiguration.DisableAppDomain=true + build-switches: -p:SkipSignAssembly=true + restore: true + build: true + download-pattern: build-${{ matrix.configuration }}-${{ matrix.arch }} + + test_qualitygate: + if: ${{ always() }} + name: test-qualitygate + needs: [init, test_linux, test_windows, test_mac] + runs-on: ubuntu-24.04 + steps: + - name: Evaluate test results + shell: bash + env: + RUN_MAC_TESTS: ${{ needs.init.outputs.run-mac-tests }} + TEST_LINUX_RESULT: ${{ needs.test_linux.result }} + TEST_WINDOWS_RESULT: ${{ needs.test_windows.result }} + TEST_MAC_RESULT: ${{ needs.test_mac.result }} + run: | + require_success() { + local job_name="$1" + local job_result="$2" + + if [[ "$job_result" != "success" ]]; then + echo "::error::$job_name finished with '$job_result'." + exit 1 + fi + } + + require_success_or_skip() { + local job_name="$1" + local job_enabled="$2" + local job_result="$3" + + if [[ "$job_enabled" == "true" ]]; then + require_success "$job_name" "$job_result" + return + fi + + if [[ "$job_result" != "success" && "$job_result" != "skipped" ]]; then + echo "::error::$job_name finished with '$job_result' while disabled." + exit 1 + fi + } + + require_success "test_linux" "$TEST_LINUX_RESULT" + require_success "test_windows" "$TEST_WINDOWS_RESULT" + require_success_or_skip "test_mac" "$RUN_MAC_TESTS" "$TEST_MAC_RESULT" sonarcloud: - if: ${{ needs.init.outputs.run-privileged-jobs == 'true' }} + if: ${{always() && needs.init.outputs.run-privileged-jobs == 'true' && needs.build.result == 'success' && needs.test_qualitygate.result == 'success'}} name: call-sonarcloud - needs: [init, build, test_linux, test_windows] + needs: [init, build, test_qualitygate] uses: codebeltnet/jobs-sonarcloud/.github/workflows/default.yml@v3 with: organization: geekle @@ -116,18 +189,18 @@ jobs: secrets: inherit codecov: - if: ${{ needs.init.outputs.run-privileged-jobs == 'true' }} + if: ${{always() && needs.init.outputs.run-privileged-jobs == 'true' && needs.build.result == 'success' && needs.test_qualitygate.result == 'success'}} name: call-codecov - needs: [init, build, test_linux, test_windows] + needs: [init, build, test_qualitygate] uses: codebeltnet/jobs-codecov/.github/workflows/default.yml@v1 with: repository: codebeltnet/yamldotnet secrets: inherit codeql: - if: ${{ needs.init.outputs.run-privileged-jobs == 'true' }} + if: ${{always() && needs.init.outputs.run-privileged-jobs == 'true' && needs.build.result == 'success' && needs.test_qualitygate.result == 'success'}} name: call-codeql - needs: [init, build, test_linux, test_windows] + needs: [init, build, test_qualitygate] uses: codebeltnet/jobs-codeql/.github/workflows/default.yml@v3 permissions: security-events: write @@ -135,7 +208,7 @@ jobs: deploy: if: github.event_name != 'pull_request' name: call-nuget - needs: [build, pack, test_linux, test_windows, sonarcloud, codecov, codeql] + needs: [build, pack, test_qualitygate, sonarcloud, codecov, codeql] uses: codebeltnet/jobs-nuget-push/.github/workflows/default.yml@v3 with: version: ${{ needs.build.outputs.version }} From 81fc73bfa63e374315561eeb6ba7443b15556f8f Mon Sep 17 00:00:00 2001 From: "aicia[bot]" Date: Sat, 6 Jun 2026 01:46:59 +0200 Subject: [PATCH 6/8] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20upgrade=20Microsoft.NE?= =?UTF-8?q?T.Test.Sdk=20to=2018.6.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updates Microsoft.NET.Test.Sdk from 18.5.1 to 18.6.0. Also normalizes line endings in Directory.Packages.props from CRLF to LF for consistency. --- Directory.Packages.props | 50 ++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index e8f96c6..398eef4 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,26 +1,26 @@ - - - true - - - - - - - - - - - - - - - - - - - - - - + + + true + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 4d2004915491526e2a4c6ffd692d8a2ddda6eaa6 Mon Sep 17 00:00:00 2001 From: "aicia[bot]" Date: Sat, 6 Jun 2026 01:47:05 +0200 Subject: [PATCH 7/8] =?UTF-8?q?=F0=9F=93=9D=20add=20code=20coverage=20test?= =?UTF-8?q?ing=20guidance=20to=20copilot=20instructions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds comprehensive section on ExcludeFromCodeCoverage prohibition, explaining why excluding code hides gaps and providing alternative approaches for untestable paths, external dependencies, configuration-only code, and generated/third-party code. --- .github/copilot-instructions.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index c646bce..199810c 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -180,6 +180,28 @@ Internal classes and methods must be validated by exercising the public API that - Public entry points provide sufficient coverage of internal code paths. - The internal implementation exists solely as a helper or utility for public-facing functionality. +## 10. ExcludeFromCodeCoverage Prohibition + +**Do not use `ExcludeFromCodeCoverage` attribute on any code.** This includes: + +- Test classes or test methods +- Production code +- Configuration code +- Any other code path + +### Rationale + +- Excluding code from coverage hides gaps and creates false confidence in test completeness. +- If a code path cannot or should not be tested, refactor the code to eliminate that path rather than hiding it from metrics. +- Every executable line should be covered by tests or be genuinely unreachable (dead code to be removed). + +### Alternative Approaches + +- **Untestable code paths**: Refactor to separate concerns and eliminate the untestable path. +- **External dependencies**: Use test doubles (fakes, stubs, spies) instead of excluding from coverage. +- **Configuration-only code**: Move to configuration files or extract into testable methods. +- **Generated or third-party code**: These should not be in the primary codebase; use NuGet packages or dedicated vendor folders if necessary. + --- description: 'Writing Performance Tests' applyTo: "tuning/**, **/*Benchmark*.cs" From caf34bcbf80c639d708e685d9d77324719998a39 Mon Sep 17 00:00:00 2001 From: gimlichael Date: Sat, 6 Jun 2026 01:51:50 +0200 Subject: [PATCH 8/8] =?UTF-8?q?=F0=9F=93=9D=20add=20.bot=20workspace=20doc?= =?UTF-8?q?umentation=20for=20local=20AI=20materials?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bot/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .bot/README.md diff --git a/.bot/README.md b/.bot/README.md new file mode 100644 index 0000000..de97dce --- /dev/null +++ b/.bot/README.md @@ -0,0 +1,10 @@ +# .bot Workspace + +This folder is reserved for local-only AI working material such as: + +- brainstorm notes +- draft implementation plans +- design alternatives +- temporary agent state + +Keep this folder out of source control. Move only finalized, non-confidential guidance into `AGENTS.md` or `.github/copilot-instructions.md`.