First off, thank you for taking the time to contribute! This project is a collection of opinionated .NET building blocks, and contributions of all kinds — bug reports, feature ideas, documentation improvements, and code — are genuinely appreciated.
This document explains how to get set up, the conventions we follow, and how to submit your changes for review.
- Report a bug — open a bug report.
- Request a feature — open a feature request.
- Improve the docs — fixes and clarifications to the README,
docs/articles, or XML documentation are always welcome. - Submit code — pick up an open issue or propose a change via a pull request.
If you plan to work on a non-trivial change, please open an issue first so we can discuss the approach before you invest significant effort.
- .NET SDK 10.0.301 or later (see
global.json). - A RabbitMQ instance (or Docker) is only required for the messaging integration tests.
# 1. Fork and clone the repository
git clone https://github.com/<your-username>/Vulthil.SharedKernel.git
cd Vulthil.SharedKernel
# 2. Restore local tools and build the solution
dotnet tool restore
dotnet build Vulthil.SharedKernel.slnx -c Release
# 3. Run the test suite
dotnet test Vulthil.SharedKernel.slnx -c Release- Create a topic branch off
main(e.g.feat/outbox-retry,fix/consumer-ack). - Make your change in small, focused commits.
- Ensure the build is clean and all tests pass locally.
- Push your branch and open a pull request against
main.
This repository follows the Conventional Commits
specification — the changelog and version bumps are generated from commit history. Use a
single-line message in the form <type>(<scope>): <description>, for example:
feat(messaging): add publisher confirms to RabbitMQ transport
fix(results): preserve error metadata when mapping
docs(readme): clarify package responsibilities
Recognized types: feat, fix, docs, perf, refactor, test, chore, ci.
The full conventions live in .github/copilot-instructions.md
and .github/instructions/. The essentials:
- Use file-scoped namespaces that match the directory structure.
- Prefer immutable types and use
recordfor immutable data. - Do not add comments inside methods. For complex logic, extract a well-named method instead.
- When you change a public member, update its XML documentation, the relevant docs
in the
docs/folder, and the README if applicable. - Do not suppress CS1591 — add the missing XML comments instead.
- Update the Public API files (
PublicAPI.*.txt) for the affected assembly when public surface changes.
- Use the Vulthil.xUnit framework and follow the Arrange–Act–Assert pattern.
- Derive from
BaseUnitTestCaseorBaseUnitTestCase<T>to leverage shared setup. - Lazily create the system under test by overriding
CreateInstance/CreateInstance<T>and exposing it through theTargetproperty. - Use the AutoMocker instance for dependencies:
Use<T>(...)to register andGetMock<T>()to retrieve mocks. - Prefer the
CancellationTokenproperty on the base test class over readingTestContext.Current.CancellationTokendirectly. - Do not add comments inside test methods other than
Arrange,Act, andAssert; name the test method to describe the behavior under test.
Before opening a PR, please confirm:
- The solution builds without warnings (
dotnet build -c Release). - All tests pass (
dotnet test -c Release). - Public API, XML documentation, and docs are updated where applicable.
- Commits follow the Conventional Commits format.
Fill out the pull request template so reviewers have the context they need. Continuous integration runs the build and full test suite on every PR; all checks must pass before a change can be merged.
By contributing, you agree that your contributions will be licensed under the MIT License that covers this project.