Conversation
Bumps csharpier from 1.1.1 to 1.1.2 Bumps xunit.analyzers from 1.23.0 to 1.24.0 Bumps xunit.runner.visualstudio from 3.1.3 to 3.1.4 --- updated-dependencies: - dependency-name: csharpier dependency-version: 1.1.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-deps - dependency-name: xunit.analyzers dependency-version: 1.24.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: nuget-deps - dependency-name: xunit.runner.visualstudio dependency-version: 3.1.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-deps ... Signed-off-by: dependabot[bot] <support@github.com>
…op/nuget-deps-0259308462 Bump the nuget-deps group with 3 updates
Bumps xunit.runner.visualstudio from 3.1.4 to 3.1.5 --- updated-dependencies: - dependency-name: xunit.runner.visualstudio dependency-version: 3.1.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-deps ... Signed-off-by: dependabot[bot] <support@github.com>
…evelop/nuget-deps-6aadeae1b1 Bump the nuget-deps group with 1 update
--- updated-dependencies: - dependency-name: csharpier dependency-version: 1.2.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: nuget-deps ... Signed-off-by: dependabot[bot] <support@github.com>
…op/nuget-deps-39349b7924 Bump csharpier from 1.1.2 to 1.2.1
--- updated-dependencies: - dependency-name: Serilog.Sinks.Console dependency-version: 6.1.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: nuget-deps ... Signed-off-by: dependabot[bot] <support@github.com>
…nuget-deps-602f419b37 Bump Serilog.Sinks.Console from 6.0.0 to 6.1.1
Bumps csharpier from 1.2.1 to 1.2.3 --- updated-dependencies: - dependency-name: csharpier dependency-version: 1.2.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-deps ... Signed-off-by: dependabot[bot] <support@github.com>
…op/nuget-deps-1689e99d0a Bump the nuget-deps group with 1 update
Bumps the actions-deps group with 2 updates in the / directory: [actions/setup-dotnet](https://github.com/actions/setup-dotnet) and [actions/checkout](https://github.com/actions/checkout). Updates `actions/setup-dotnet` from 4 to 5 - [Release notes](https://github.com/actions/setup-dotnet/releases) - [Commits](actions/setup-dotnet@v4...v5) Updates `actions/checkout` from 5 to 6 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](actions/checkout@v5...v6) --- updated-dependencies: - dependency-name: actions/setup-dotnet dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions-deps - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions-deps ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps csharpier from 1.2.3 to 1.2.4 --- updated-dependencies: - dependency-name: csharpier dependency-version: 1.2.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-deps ... Signed-off-by: dependabot[bot] <support@github.com>
…op/nuget-deps-133b2bc611 Bump the nuget-deps group with 1 update
Bumps csharpier from 1.2.4 to 1.2.5 --- updated-dependencies: - dependency-name: csharpier dependency-version: 1.2.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-deps ... Signed-off-by: dependabot[bot] <support@github.com>
…op/nuget-deps-262ca43251 Bump the nuget-deps group with 1 update
* Initial plan * Make HttpClient timeout configurable via TimeoutSeconds property Co-authored-by: ptr727 <2061579+ptr727@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: ptr727 <2061579+ptr727@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Initial plan * Replace redundant ToString() with string interpolation in FileExAsyncTests --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
* Initial plan * Replace explicit ToString() calls with string interpolation Co-authored-by: ptr727 <2061579+ptr727@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: ptr727 <2061579+ptr727@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
…304) Bumps the actions-deps group with 1 update: [dependabot/fetch-metadata](https://github.com/dependabot/fetch-metadata). Updates `dependabot/fetch-metadata` from 2 to 3 - [Release notes](https://github.com/dependabot/fetch-metadata/releases) - [Commits](dependabot/fetch-metadata@v2...v3) --- updated-dependencies: - dependency-name: dependabot/fetch-metadata dependency-version: '3' dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions-deps ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Convert to two-phase dual-publish release model Replace publish-on-push with the ProjectTemplate/LanguageTags two-phase model: PRs smoke-test only, and publish-release.yml publishes both branches on a weekly schedule (Mon 02:00 UTC) or manual dispatch, with idempotent no-op republish. Adopt the reusable workflow set (get-version, build-nugetlibrary, build-release, build-datebadge), a branch-aware Dependabot merge-bot, Central Package Management, and an AGENTS.md tracking the template. NuGet.org-only (drop GitHub Packages); no Docker/exe/PyPI/codegen. Reconcile the template's strict analyzers (AnalysisMode All + TreatWarningsAsErrors) with the brownfield library by relaxing specific rules in .editorconfig and IL3058 via NoWarn, all documented. * Normalize line endings to .editorconfig; fix husky hook Convert the workflow YAML, dependabot.yml, and AGENTS.md (added LF) to CRLF per .editorconfig, and make .husky/pre-commit LF + executable so its shebang execs on Linux/WSL. Add an .editorconfig rule pinning the hook to LF. * Quote "$GITHUB_OUTPUT" in date-badge task
Contributor
There was a problem hiding this comment.
Pull request overview
Promotes the repository to the two-phase dual-publish release model (PRs smoke-test only; publishing centralized in publish-release.yml), while also modernizing the .NET solution to .NET 10/AOT and aligning build/test/package management with the template conventions for easier future upstream syncing.
Changes:
- Replaces the legacy publish-on-push pipeline with reusable workflow tasks + branch-aware scheduled/manual publishing and a Dependabot merge-bot.
- Introduces Central Package Management (
Directory.Build.props/Directory.Packages.props) and normalizes solution/repo metadata (.slnx,AGENTS.md,.editorconfig). - Modernizes the Utilities library (AOT config, async APIs, improved XML docs) and expands xUnit coverage with new test files.
Reviewed changes
Copilot reviewed 45 out of 47 changed files in this pull request and generated 22 comments.
Show a summary per file
| File | Description |
|---|---|
| version.json | Bumps base version for NBGV-managed releases. |
| UtilitiesTests/UtilitiesTests.csproj | Moves test deps to Central Package Management and inherits net10.0 from props. |
| UtilitiesTests/UtilitiesTests.cs | Cleans up usings to rely on implicit usings. |
| UtilitiesTests/StringHistoryTests.cs | Adds coverage for StringHistory behavior. |
| UtilitiesTests/StringCompressionTests.cs | Cleans up usings. |
| UtilitiesTests/StringCompressionAsyncTests.cs | Adds async compression/decompression test coverage. |
| UtilitiesTests/FileExAsyncTests.cs | Adds async FileEx API coverage. |
| UtilitiesTests/ExtensionsTests.cs | Adds coverage for compression/logger extension methods. |
| UtilitiesTests/DownloadTests.cs | Cleans up usings. |
| UtilitiesTests/DownloadAsyncTests.cs | Adds async Download API tests. |
| UtilitiesTests/ConsoleTests.cs | Replaces placeholder test with ConsoleEx coverage. |
| Utilities/Utilities.csproj.user | Removes user-specific Visual Studio metadata from repo. |
| Utilities/Utilities.csproj | Enables AOT-related properties, XML docs generation, and Husky bootstrapping target. |
| Utilities/StringHistory.cs | Adds XML docs, null checking, and refactors ToString() implementation. |
| Utilities/StringCompression.cs | Adds XML docs, compression level support, and async APIs with cancellation. |
| Utilities/ProcessEx.cs | Removes legacy process wrapper API. |
| Utilities/LogOptions.cs | Adds XML documentation to global logger config. |
| Utilities/Format.cs | Adds XML docs and refactors byte-format logic. |
| Utilities/FileExOptions.cs | Adds XML docs and clarifies option semantics. |
| Utilities/FileEx.cs | Adds async variants, improves XML docs, refactors logging helpers, and adds new helpers. |
| Utilities/Extensions.cs | Migrates to C# extension blocks; adds compression + logger helpers with caller info. |
| Utilities/Download.cs | Adds async APIs, shared HttpClient via Lazy<>, and improves header-only requests. |
| Utilities/ConsoleEx.cs | Adds XML docs and improves null handling. |
| Utilities/CommandLineEx.cs | Adds XML docs and tweaks argument splitting behavior. |
| Utilities.slnx | Replaces .sln with .slnx including solution items/workflow files. |
| Utilities.sln | Removes legacy Visual Studio solution file. |
| Sandbox/Sandbox.csproj | Aligns sandbox project with net10/AOT + central package mgmt. |
| Sandbox/Program.cs | Adjusts assembly base directory logic. |
| README.md | Updates workflow badge and adds version history notes. |
| Directory.Packages.props | Introduces centrally-managed package versions. |
| Directory.Build.props | Introduces shared build settings (net10.0, analyzers, CPM). |
| AGENTS.md | Documents branching/release/workflow conventions for humans/agents. |
| .husky/task-runner.json | Adjusts dotnet format invocation settings. |
| .husky/pre-commit | Normalizes pre-commit hook formatting/line endings. |
| .gitignore | Adds .artifacts and corrects .user ignore pattern. |
| .github/workflows/test-pull-request.yml | Adds PR smoke-test workflow with required-check aggregator job. |
| .github/workflows/publish-release.yml | Adds central publish workflow (schedule/dispatch; opt-in push publishing). |
| .github/workflows/merge-bot-pull-request.yml | Adds branch-aware Dependabot merge-bot with app-token strategy. |
| .github/workflows/get-version-task.yml | Adds reusable NBGV version-resolution task. |
| .github/workflows/DependabotAutoMerge.yml | Removes legacy Dependabot auto-merge workflow. |
| .github/workflows/BuildPublishPipeline.yml | Removes legacy build/publish pipeline workflow. |
| .github/workflows/build-release-task.yml | Adds reusable orchestrator for build + publish + GitHub release. |
| .github/workflows/build-nugetlibrary-task.yml | Adds reusable NuGet library build/push task. |
| .github/workflows/build-datebadge-task.yml | Adds reusable date-badge workflow. |
| .github/dependabot.yml | Updates Dependabot config to dual-target main and develop with documentation. |
| .github/copilot-instructions.md | Adds repository-specific Copilot guidance (style/AOT/testing). |
| .editorconfig | Documents analyzer relaxations and adds Husky hook line-ending rule. |
Comments suppressed due to low confidence (1)
Utilities/FileEx.cs:333
- RenameFile compares directories via originalDirectory.Equals(...), which will throw if either path has no directory component (GetDirectoryName returns null). After allowing relative paths, use string.Equals to handle nulls safely.
// Retry
if (originalDirectory.Equals(newDirectory, StringComparison.OrdinalIgnoreCase))
{
Comment on lines
+287
to
+300
| if ( | ||
| string.IsNullOrEmpty(originalDirectory) | ||
| || string.IsNullOrEmpty(originalFile) | ||
| || string.IsNullOrEmpty(newDirectory) | ||
| || string.IsNullOrEmpty(newFile) | ||
| ) | ||
| { | ||
| LogOptions.Logger.Error( | ||
| "Renaming file failed due to invalid path(s) : {OriginalName} to {NewName}", | ||
| originalName, | ||
| newName | ||
| ); | ||
| return false; | ||
| } |
Comment on lines
+387
to
+400
| if ( | ||
| string.IsNullOrEmpty(originalDirectory) | ||
| || string.IsNullOrEmpty(originalFile) | ||
| || string.IsNullOrEmpty(newDirectory) | ||
| || string.IsNullOrEmpty(newFile) | ||
| ) | ||
| { | ||
| LogOptions.Logger.Error( | ||
| "Renaming file failed due to invalid path(s) : {OriginalName} to {NewName}", | ||
| originalName, | ||
| newName | ||
| ); | ||
| return false; | ||
| } |
Comment on lines
+428
to
+430
| // Retry | ||
| if (originalDirectory.Equals(newDirectory, StringComparison.OrdinalIgnoreCase)) | ||
| { |
Comment on lines
+1146
to
+1148
| string? directory = Path.GetDirectoryName(filePath); | ||
| string fileName = $"{timeStamp:yyyyMMddTHHmmss}_{Path.GetFileName(filePath)}"; | ||
| return Path.Combine(directory, fileName); | ||
| return Path.Combine(directory!, fileName); |
Comment on lines
+110
to
+114
| fileName | ||
| ); | ||
| await Task.Delay(Options.RetryWaitTime * 1000, cancellationToken) | ||
| .ConfigureAwait(false); | ||
| } |
| { | ||
| private readonly UtilitiesTests _fixture = fixture; | ||
| [Fact] |
| Assert.True(size > 0); | ||
| } | ||
| [Fact] |
| Assert.Contains("google", content, StringComparison.OrdinalIgnoreCase); | ||
| } | ||
| [Fact] |
| } | ||
| } | ||
| [Fact] |
| Assert.False(success); | ||
| } | ||
| [Fact] |
ptr727
commented
Jun 5, 2026
OwnerAuthor
Superseded by the release branch PR |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Release PR promoting the two-phase dual-publish release model from
developtomain(squashed via #320).On merge, this is the first
mainstate with the new model:publish-release.ymlbecomes the sole publisher (weekly Monday 02:00 UTC + manual dispatch, both branches, idempotent), PRs smoke-test only, and a branch-aware Dependabot merge-bot replaces the legacy auto-merge. Also includes Central Package Management,AGENTS.md, documented analyzer relaxations for the strict template settings, and line-ending/husky-hook normalization.See #320 for the full change description and Copilot review.
Maintainer follow-ups (after this merges)
CODEGEN_APP_CLIENT_ID/CODEGEN_APP_PRIVATE_KEY(GitHub App) to both Actions and Dependabot secret stores for the merge-bot.Check pull request workflow statusrequired check to thedevelop(squash-only) andmain(merge-only) rulesets.PUBLISH_ON_MERGEunset for the two-phase default; trigger the first publish viapublish-release.yml→ Run workflow.🤖 Generated with Claude Code