This repository contains independently versioned Aspire extensions. Each extension owns its packages, source, tests, runnable samples, documentation, semantic-release configuration, and workflow entry points under one folder in extensions/.
| Package | Purpose | Documentation |
|---|---|---|
Shirubasoft.Aspire.CloudflareTunnels |
Named Cloudflare Tunnels and account-free Quick Tunnels. | Cloudflare Tunnels extension |
Shirubasoft.Aspire.Extensions.Kafka |
Confluent Schema Registry and idempotent Kafka topic resources. | Kafka extension |
Shirubasoft.Aspire.Extensions.Multirepo |
Typed module contracts and multi-repository AppHost composition, testing, templates, and workflow tooling. | Multirepo extension |
Shirubasoft.Aspire.Extensions.ResourceGroups |
Logical parent resources that organize an AppHost resource graph. | Resource Groups extension |
Shirubasoft.Aspire.Extensions.TestProjects |
AppHost-managed test suites with dashboard commands and Markdown results. | Test Projects extension |
Install the .NET SDK pinned in global.json, then run:
./build.shBuild one extension with:
./build.sh --extension extensions/Shirubasoft.Aspire.Extensions.KafkaThe Windows entry point is ./build.ps1. Both entry points restore tools, verify formatting, build with warnings as errors, run unit and package contract tests, and create .nupkg and .snupkg files under artifacts/<primary-package-id>/. An extension can publish related packages from that artifact directory under one version.
The repository uses shared reusable workflows for CI, stable releases, and manually confirmed prereleases. Thin extension workflows supply the extension path, primary package ID, artifact name, release configuration, and tag prefix.
Each extension versions independently from Conventional Commits that touch its own folder or shared package inputs. Related packages from one extension share that version. For example, Kafka releases use tags such as kafka-v1.2.3. A feat commit produces a minor release, a fix commit produces a patch release, and a breaking change produces a major release.
CI runs on Linux and Windows. Linux also measures method-level CRAP scores from OpenCover data and fails unless every method scores strictly below 5. After a successful main build, semantic-release publishes the package and symbols to NuGet.org with the NUGET_API_KEY organization secret, creates the package tag, and attaches both files to a GitHub release.
Use the repository skill in .agents/skills/add-aspire-extension/. It treats an existing local extension as the template, keeps package-specific files together, and reuses the root build, quality, and release tooling.
See CONTRIBUTING.md for the repository contract.