Contributing
Repository layout
src/ the shipped packages
tests/ unit tests, generator tests, and integration tests on real database engines
samples/ a showcase API exercising the whole chain end to end
benchmarks/ the measurements behind the design decisions
skills/ the agent skill, distributed as a Claude Code plugin through .claude-plugin/
website/ this documentation site
Building
dotnet build
dotnet test tests/AdCodicem.ValueObjects.UnitTests # no Docker needed
dotnet test tests/AdCodicem.ValueObjects.GeneratorTests # no Docker needed
dotnet test # everything, Docker required
dotnet pack -c Release
Integration tests start PostgreSQL and SQL Server through Testcontainers, so they need a Docker daemon.
Commit hygiene
pip install pre-commit
pre-commit install
installs a pre-commit and a commit-msg hook that also run in CI:
- committed files must stay usable on a case-insensitive, no-symlink Windows checkout;
- commit messages must follow Conventional Commits.
The agent skill
skills/value-objects/ is what an AI coding agent reads before writing a value object: the attribute options,
the hook interfaces, what the generator already emits, the wiring of each integration, and every VO00xx
diagnostic. Consumers install it with /plugin marketplace add AdCodicem/AdCodicem.ValueObjects, so it is a
shipped artefact rather than a note to ourselves.
A change to the surface a consumer writes against goes in the skill in the same commit — a new option on
[ValueObject<T>], a new hook interface, a new diagnostic, a new error code, a renamed extension method. Two
test classes in AdCodicem.ValueObjects.GeneratorTests make that mechanical rather than a thing to remember:
DocumentationSnippetTestsruns the generator and the analyzers over every C# snippet the repository publishes — the skill, this site, and the README. A skill snippet must compile outright, since an agent copies it verbatim; a snippet here is prose and may elide a body, so what is checked is the declaration the generator sees. A wiring or usage fragment is tagged```csharp skip. This is what would have caught the README teachingNormalizeCorefor months after hooks became interfaces.SkillCoverageTestsreflects over the shipped assemblies and fails when an attribute option, a hook member, a diagnostic identifier or a well-known error code is missing from the skill.
Keep it prescriptive: the reasoning, the benchmarks and the design decisions belong on this site, and the skill stays short enough to be worth loading.
This site
The site itself is a Docusaurus project under website/:
cd website
npm ci
npm start # local dev server with hot reload
npm run build # production build, fails on a broken internal link
It deploys to GitHub Pages automatically on every push to main that touches website/.
Licence
MIT.