The dknet-minimal plugin lives in plugin/: plugin/.claude-plugin/plugin.json +
plugin/skills/ + plugin/agents/ (Claude Code). The repository root keeps only the entry points
that have to be found there — .claude-plugin/marketplace.json (pointing at ./plugin),
plugin.json (GitHub Copilot) and package.json (npm). One set of
Agent Skills teaches an AI coding agent how to build on this template: the
layer boundaries, every endpoint shape (hand-mapped, generated Map<Entity>Crud(), or the generic
route helpers), actions and queries, FluentValidation + Mapster DTOs, domain entities and static
seeding, SlimMessageBus internal events and Azure Service Bus forwarding, auth/ownership and every
FeatureManagement flag. Eight of the skills are slash workflows that scaffold a vertical slice end to
end; three Claude Code subagents (dknet-architect, dknet-implementer, dknet-bdd-engineer) back
/dknet-feature. Index of every skill: plugin/skills/README.md.
dotnet new dknet-minimal does not copy the plugin into a generated solution (only AGENTS.md
ships) — install it into the generated repo with one of the install channels below.
The install channels — Claude Code, GitHub Copilot, the skills CLI and npm — are in the repository
README, where validate-plugin.sh checks that every advertised channel
carries a non-empty instruction.
Working on this repository
claude --plugin-dir plugin # loads plugin/skills/ and plugin/agents/ from the checkout
./validate-plugin.sh # manifests, README install channels, skill portability
| Workflow | Purpose |
|---|---|
/dknet-feature <Feature> <Entity> [mode=manual\|auto] [props…] |
Full vertical slice: plan → entity → CRUD → endpoint → tests → BDD → docs |
/dknet-feature-remove <Feature> |
Retire a slice, its touchpoints and its tables (drop migration) |
/dknet-entity <Feature> <Entity> [mode=…] [props…] |
Domain entity + EF mapper + migration |
/dknet-crud <Feature> <Entity> [mode=…] |
AppServices CRUD (DTO + Create/Update/Delete + spec + event), or the generator attributes |
/dknet-endpoint <Feature> <Entity> [mode=…] |
Minimal API IEndpointConfig — hand-mapped with idempotency, or Map<Entity>Crud() |
/dknet-unit-tests <Feature> <Entity> [mode=…] |
xUnit + Shouldly tests through ApiFixture + IMessageBus |
/dknet-bdd-tests <Feature> |
Reqnroll + NUnit BDD scenarios |
/dknet-docs <Feature> |
Feature documentation under docs/features/<feature>/ |
| Reference skill | Teaches |
|---|---|
dknet-project-structure |
Layers, folder footprint, auto-discovery, which skill for what — read first |
dknet-ddd-principles |
Aggregate boundaries, invariants, when an event is warranted |
dknet-feature-lifecycle |
Manual vs automated flow decision, feature footprint, removal rules |
dknet-scaffold |
dotnet new dknet-minimal, parameters, first run, deleting the samples, installing this plugin |
dknet-entity |
AggregateRoot entities, [CrudCreate]/[CrudUpdate]/[CrudAction]/[RaisesEvent], IOwnedBy, [SensitiveData] |
dknet-efcore-config |
Mappers, static data seeding (both wiring paths), CoreDbContext, migrations |
dknet-crud |
Commands, FluentValidation (incl. 409 preconditions), handlers, generated requests |
dknet-queries-specs |
Specification<T>, query handlers, paging, the generic filter/search/order list route |
dknet-dto-mapping |
Hand-written vs [GenerateDto] DTOs, Mapster config and IRegister custom mapping, ResultOf |
dknet-endpoint |
IEndpointConfig; raw routes, Map<Entity>Crud() + CrudMapOptions, generic helpers; idempotency; scopes |
dknet-messaging-events |
SlimMessageBus in-memory bus, domain events (manual/declared), Azure Service Bus Produce/Consume |
dknet-auth-and-ownership |
JWT + scopes, demo auth, [FromClaim], DataOwnerHook, row-level isolation, sensitive data |
dknet-platform-config |
Start-up order, every FeatureManagement flag and config section, Aspire, jobs, health, OpenAPI |
dknet-unit-tests / dknet-bdd-tests |
What each suite owns, fixtures, worked examples, the business-tests-only rule |
dknet-docs |
README + Mermaid architecture + API reference for a finished feature |
dknet-package-adoption |
Using DKNet packages in a project not created from the template |
Release. Versions stay 0.0.0 in git. publish-nuget-github.yml computes the release version from
tags on main, packs and publishes the NuGet template, creates the GitHub release, then stamps the same
version into package.json / plugin.json / plugin/.claude-plugin/plugin.json (npm version →
scripts/sync-version.mjs), validates the skills (agentskills validate, claude plugin validate,
npx skills add --list, ./validate-plugin.sh) and publishes @drunkcoding/dknet-implementation-skills to npm
with OIDC trusted publishing. A version already on npm is skipped.