![]() |
VOOZH | about |
dotnet add package Invex.RepoUtils.Atom.Module --version 1.5.0
NuGet\Install-Package Invex.RepoUtils.Atom.Module -Version 1.5.0
<PackageReference Include="Invex.RepoUtils.Atom.Module" Version="1.5.0" />
<PackageVersion Include="Invex.RepoUtils.Atom.Module" Version="1.5.0" />Directory.Packages.props
<PackageReference Include="Invex.RepoUtils.Atom.Module" />Project file
paket add Invex.RepoUtils.Atom.Module --version 1.5.0
#r "nuget: Invex.RepoUtils.Atom.Module, 1.5.0"
#:package Invex.RepoUtils.Atom.Module@1.5.0
#addin nuget:?package=Invex.RepoUtils.Atom.Module&version=1.5.0Install as a Cake Addin
#tool nuget:?package=Invex.RepoUtils.Atom.Module&version=1.5.0Install as a Cake Tool
A collection of .NET utilities for building and maintaining .NET repositories.
Invex.RepoUtils bundles the tooling the Invex team uses to keep its .NET repositories
consistent, well-versioned, and safe to release. It ships three complementary pieces:
| Package | Description | Target |
|---|---|---|
Invex.RepoUtils.PublicApiAnalyzers |
Roslyn analyzer that flags public members not annotated as part of the public API surface. | netstandard2.0 |
Invex.RepoUtils.TestUtils |
Test utilities for snapshot-testing your assembly's public API surface. | netstandard2.0, net8.0, net9.0, net10.0 |
Invex.RepoUtils.Atom.Module |
Atom build module providing pack/test/release, breaking-change, and Dependabot CI targets. | net10.0 |
A Roslyn diagnostic analyzer that helps you keep an intentional public API surface. It reports
every effectively-public member that is not annotated with [PublicAPI] (or another attribute
you allow), so that exposing a new type or member is always a deliberate, reviewable decision.
dotnet add package Invex.RepoUtils.PublicApiAnalyzers
The package is shipped as a development dependency (analyzer only) — it contributes no runtime assemblies to your output.
| Rule ID | Category | Severity | Description |
|---|---|---|---|
IPAA0001 |
Design | Warning | Public member should be annotated with [PublicAPI] (or another configured valid attribute). |
The analyzer is attribute-aware and intentionally avoids false positives:
override members are
ignored.By default the analyzer accepts PublicAPI / PublicAPIAttribute. You can extend the set of
attributes that satisfy the rule via an .editorconfig entry. Provide a comma-separated list of
attribute names (the Attribute suffix is optional — both forms are accepted):
# .editorconfig
[*.cs]
dotnet_code_quality.Invex_RepoUtils_PublicApiAnalyzers_ValidPublicApiAttributes = Experimental, MyCompanyApi
To change the severity of the rule:
[*.cs]
dotnet_diagnostic.IPAA0001.severity = error
using JetBrains.Annotations;
// ⚠️ IPAA0001 — public type is not annotated.
public class Unmarked { }
// ✅ Annotated type — the type and all its public members are considered part of the API surface.
[PublicAPI]
public class Marked
{
public int Value { get; set; }
}
A test utility library that makes it easy to snapshot-test the public API surface of your assemblies. It uses reflection to extract all public types and their members, serialises the result to JSON, and pairs well with Verify for approval-based testing.
dotnet add package Invex.RepoUtils.TestUtils
Call PublicApiSurfaceTestUtil.GetPublicApiSurface with the assembly you want to inspect. The
returned JSON string can be verified with your preferred snapshot testing library:
using Invex.RepoUtils.TestUtils;
[Test]
public Task PublicApiSurface()
{
var surface = PublicApiSurfaceTestUtil.GetPublicApiSurface(typeof(MyLibType).Assembly);
return Verify(surface);
}
An Atom build module that contributes reusable, opinionated
CI/CD building blocks. Add the interfaces you need to your Atom IBuild definition and wire the
provided Targets into your workflows.
dotnet add package Invex.RepoUtils.Atom.Module
| Target | Interface | Purpose |
|---|---|---|
ApproveDependabotPr |
IApproveDependabotPr |
Enables auto-merge on pull requests opened by dependabot[bot]. |
CheckPrForBreakingChanges |
ICheckPrForBreakingChanges |
Detects public API breaking changes in a PR and reports the result as a GitHub check run. |
WaitForCopilotReview |
IWaitForCopilotReview |
Blocks until GitHub Copilot has finished reviewing a PR (e.g. before enabling auto-merge). |
| Helper | Purpose |
|---|---|
IApiSurfaceHelper |
Diffs API definition files between two commits and classifies major/minor breaking changes. |
IPrBreakingChangeHelper |
Orchestrates the full PR breaking-change check against the latest release baseline. |
IGithubPrHelper |
Surfaces the GitHub pull-request number parameter for PR-scoped targets. |
INugetPackageUnlistHelper |
Discovers superseded prereleases (or all prereleases below a given stable version) via the NuGet flat-container API and unlists them with resilient HTTP DELETE calls, writing a summary to the Atom build report. |
IDocFxHelper |
Builds, serves, and publishes DocFX documentation to a project's gh-pages branch for GitHub Pages hosting. |
ICopilotReviewHelper |
Polls a pull request until GitHub Copilot has finished reviewing it, failing on timeout. |
DependabotEnableAutoMergePat |
Adds GitHub-specific injection options: BuildOptions.Inject.Github.PullRequestNumber (PR number from the event payload) and BuildOptions.Inject.Github.DependabotEnableAutoMergePat (the Dependabot auto-merge PAT secret). |
The breaking-change check compares the current build version against the most recent release tag
(v{semver}). It classifies removals from the public API surface as major changes and
additions as minor changes, then verifies the version has been bumped appropriately and posts
a pass/fail GitHub check run with a detailed summary.
Add the desired interfaces to your build definition and reference the targets from a workflow:
[BuildDefinition]
[GenerateEntryPoint]
internal interface IBuild :
IWorkflowBuildDefinition,
IApproveDependabotPr,
ICheckPrForBreakingChanges
{
// Point the breaking-change check at your public API definition files.
IEnumerable<RootedPath> ICheckPrForBreakingChanges.BreakingChangeFilesToCheck =>
[
// e.g. RootedFileSystem.AtomRootDirectory / "src/MyLib/PublicAPI.Shipped.txt",
];
}
See for the full build definition used by this repository,
including the Validate, Build, and Dependabot auto-merge workflows.
.
├── _atom/ # Atom build definition for this repo (IBuild.cs)
├── src/
│ ├── Invex.RepoUtils.Atom.Module/ # Atom CI/CD module (targets, helpers, models)
│ ├── Invex.RepoUtils.PublicApiAnalyzers/ # Roslyn public-API analyzer
│ └── Invex.RepoUtils.TestUtils/ # Test utilities for public API surface snapshots
├── tests/
│ ├── Invex.RepoUtils.Atom.Module.Tests/
│ ├── Invex.RepoUtils.PublicApiAnalyzers.Tests/
│ └── Invex.RepoUtils.TestUtils.Tests/
├── Directory.Build.props # Shared build settings
├── GitVersion.yml # Versioning configuration
└── Invex.RepoUtils.slnx # Solution
The repository targets .NET 10 and uses C# 14, with TreatWarningsAsErrors enabled.
# Restore & build the whole solution
dotnet build Invex.RepoUtils.slnx
# Run the analyzer test suite
dotnet test
The analyzer is validated across .NET 8, 9, and 10 reference assemblies in CI.
Versions are derived automatically by GitVersion using Conventional Commits. The commit message prefix drives the bump:
| Prefix | Bump |
|---|---|
breaking: / major: |
Major |
feat: / feature: / minor: |
Minor |
fix: / patch: |
Patch |
semver-none / semver-skip |
None |
Contributions are welcome! Please:
[PublicAPI] — the analyzer in this repo enforces it.dotnet build and dotnet test pass before opening a PR.The Validate workflow runs the build, the test matrix, and the breaking-change check on every
pull request into main.
Licensed under the . Copyright © 2026 Invex Games.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 is compatible. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
This package is not used by any NuGet packages.
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.6.0-rc.6 | 38 | 6/17/2026 |
| 1.5.0 | 911 | 6/11/2026 |
| 1.4.0 | 255 | 6/10/2026 |
| 1.4.0-rc.5 | 47 | 6/10/2026 |
| 1.3.1-rc.1 | 48 | 6/10/2026 |
| 1.3.0 | 211 | 6/10/2026 |
| 1.2.0 | 96 | 6/9/2026 |
| 1.1.0 | 94 | 6/9/2026 |