Contributing
DockYARP is developed spec-first with OpenSpec. Every change — feature, fix, or refinement — follows the same loop.
Environment setup
Required for any contribution:
- .NET 10 SDK — or skip installing it:
build.ps1/build.sh(Fallout) fetch the SDK pinned byglobal.jsonautomatically if it’s missing. - Node.js — needed to run the OpenSpec CLI
(
npx @fission-ai/openspec@latest), the tool every change goes through (propose / apply / archive). This repo has no other Node dependency outside the docs site. - git.
- Docker — only required for
./build.ps1 E2E. The unit/integration gate (./build.ps1 Test) needs none.
Using Claude Code
Optional, on top of the above — not a second toolchain. The checked-in .mcp.json (git / microsoft-docs /
docker / aspire MCP servers) auto-enables via .claude/settings.json, and .claude/commands/opsx/* +
.claude/skills/openspec-* wire the /opsx:* slash commands to the OpenSpec CLI above. None of this is
required to contribute — the OpenSpec CLI works standalone from any editor or agent.
Change lifecycle
- Backlog — an item under
openspec/backlog/items/<id>.mddescribes the gap (the parity matrixopenspec/backlog/parity.mdtracks nginx-proxy ↔ DockYARP coverage). - Propose — author the change’s
proposal.md/design.md/tasks.md/ spec delta. - Apply — implement it, with the build and tests green.
- Archive — commit, then sync the spec library and archive the change.
- Close the loop — remove the backlog item and flip its parity row to ✅.
Submitting a contribution
Without direct push access, run the same loop on a fork:
- Fork the repository, and branch off
develop(see Change lifecycle above for the loop itself — this is the same loop, just on your own branch). - Follow the commit convention documented in
AGENTS.md— do not invent your own format. - Open a pull request against
develop.
develop is the trunk pre-1.0; main is reserved for releases (created at the first one — see
Releasing).
Build & test
dotnet build DockYarp.slnx
dotnet test DockYarp.slnx # or ./build.ps1 Test (Fallout)
Quality is enforced at compile time (warnings are errors, strict analyzers, XML docs). See AGENTS.md for the
full conventions.
Testing
DockYARP follows a test pyramid — each layer proves what the one below cannot, so the slow end-to-end suite stays small:
- Unit (per
*.Testsproject) — pure logic; most coverage lives here. - Integration (
DockYarp.IntegrationTests,Microsoft.AspNetCore.Mvc.Testing) — the ASP.NET pipeline in-process, no Docker. - End-to-end (Aspire AppHost + Docker) — only what needs the real running stack: discovery, live TLS/ALPN/ACME, protocol negotiation.
Add an e2e only for behavior unit and integration cannot prove. The full map of what each e2e covers — and what
is deliberately not — lives in docs/testing.md; keep it in sync when you
add or remove an e2e.
Run the gates with Fallout:
./build.ps1 Test # unit + integration (the CI gate)
./build.ps1 E2E # end-to-end (requires Docker)
./build.ps1 Docs # build this documentation site
Architecture
For a map of the modules and how a request flows through the proxy, see
docs/architecture.md.
Releases
See Releasing for the step-by-step process, including the one-time main
bootstrap at the first release.
This documentation site
Lives under docs-site/ (Hugo + Docsy). See its README.md for local setup and build.