From 5b9c79c5cb79aef80c84f0b51a89a0c3804979d0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 9 Jul 2026 05:08:26 +0000 Subject: [PATCH 1/8] Initial plan From a891d8c6bd355d59c7afc27ad61f97c0adb9816b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 9 Jul 2026 05:34:50 +0000 Subject: [PATCH 2/8] docs: auto-generate and validate README integrations table Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> --- .../workflows/readme-integrations-check.yml | 27 +++ README.md | 124 ++++++++------ eng/scripts/generate-readme-integrations.py | 158 ++++++++++++++++++ 3 files changed, 260 insertions(+), 49 deletions(-) create mode 100644 .github/workflows/readme-integrations-check.yml create mode 100755 eng/scripts/generate-readme-integrations.py diff --git a/.github/workflows/readme-integrations-check.yml b/.github/workflows/readme-integrations-check.yml new file mode 100644 index 000000000..571d5e97c --- /dev/null +++ b/.github/workflows/readme-integrations-check.yml @@ -0,0 +1,27 @@ +name: README Integrations Check + +on: + pull_request: + paths: + - README.md + - src/**/CommunityToolkit.Aspire*.csproj + - src/**/README.md + - eng/scripts/generate-readme-integrations.py + - .github/workflows/readme-integrations-check.yml + +jobs: + validate-readme-integrations: + name: Validate integrations table + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Verify README integrations table is up to date + run: python eng/scripts/generate-readme-integrations.py --check diff --git a/README.md b/README.md index 3abed65fe..686aeb9f2 100644 --- a/README.md +++ b/README.md @@ -12,55 +12,81 @@ All features are contributed by you, our amazing Aspire community, and maintaine This repository contains the source code for the Aspire Community Toolkit, a collection of community created Integrations and extensions for [Aspire](https://aka.ms/dotnet/aspire). -| Package | Description | -| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| - **Learn More**: [`Hosting.Golang`][golang-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Golang][golang-shields]][golang-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Golang][golang-shields-preview]][golang-nuget-preview] | A hosting integration Golang apps. | -| - **Learn More**: [`Hosting.Java`][java-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Java][java-shields]][java-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Java][java-shields-preview]][java-nuget-preview] | An integration for running Java code in Aspire either using the local JDK or using a container. | -| - **Learn More**: [`Hosting.K3s`][k3s-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.K3s][k3s-shields]][k3s-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.K3s][k3s-shields-preview]][k3s-nuget-preview] | An Aspire hosting integration for [k3s](https://k3s.io/), a lightweight Kubernetes distribution by Rancher. | -| - **Learn More**: [`Hosting.NodeJS.Extensions`][nodejs-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.NodeJS.Extensions][nodejs-ext-shields]][nodejs-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.JavaScript.Extensions][nodejs-ext-shields-preview]][nodejs-ext-nuget-preview] | An integration that contains some additional extensions for running Node.js applications | -| - **Learn More**: [`Hosting.Ollama`][ollama-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Ollama][ollama-shields]][ollama-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Ollama][ollama-shields-preview]][ollama-nuget-preview] | An Aspire hosting integration leveraging the [Ollama](https://ollama.com) container with support for downloading a model on startup. | -| - **Learn More**: [`OllamaSharp`][ollama-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.OllamaSharp][ollamasharp-shields]][ollamasharp-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.OllamaSharp][ollamasharp-shields-preview]][ollamasharp-nuget-preview] | An Aspire client integration for the [OllamaSharp](https://github.com/awaescher/OllamaSharp) package. | -| - **Learn More**: [`Hosting.Meilisearch`][meilisearch-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Meilisearch][meilisearch-shields]][meilisearch-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Meilisearch][meilisearch-shields-preview]][meilisearch-nuget-preview] | An Aspire hosting integration leveraging the [Meilisearch](https://meilisearch.com) container. | -| - **Learn More**: [`Meilisearch`][meilisearch-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Meilisearch][meilisearch-client-shields]][meilisearch-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Meilisearch][meilisearch-client-shields-preview]][meilisearch-client-nuget-preview] | An Aspire client integration for the [Meilisearch](https://github.com/meilisearch/meilisearch-dotnet) package. | -| - **Learn More**: [`Hosting.Azure.DataApiBuilder`][dab-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder][dab-shields]][dab-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder][dab-shields-preview]][dab-nuget-preview] | A hosting integration for the [Azure Data API builder](https://learn.microsoft.com/en-us/azure/data-api-builder/overview). | -| - **Learn More**: [`Hosting.Deno`][deno-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Deno][deno-shields]][deno-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Deno][deno-shields-preview]][deno-nuget-preview] | A hosting integration for the Deno apps. | -| - **Learn More**: [`Hosting.SqlDatabaseProjects`][sql-database-projects-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects][sql-database-projects-shields]][sql-database-projects-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects][sql-database-projects-shields-preview]][sql-database-projects-nuget-preview] | A hosting integration for the SQL Databases Projects. | -| - **Learn More**: [`Hosting.Rust`][rust-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Rust][rust-shields]][rust-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Rust][rust-shields-preview]][rust-nuget-preview] | A hosting integration for the Rust apps. | -| - **Learn More**: [`Hosting.Bun`][bun-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Bun][bun-shields]][bun-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Bun][bun-shields-preview]][bun-nuget-preview] | **Deprecated**: use the core `Aspire.Hosting.JavaScript` `AddBunApp(...)` integration. | -| - **Learn More**: [`Hosting.Bitwarden.SecretManager`][bitwarden-secret-manager-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager][bitwarden-secret-manager-hosting-shields]][bitwarden-secret-manager-hosting-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager][bitwarden-secret-manager-hosting-shields-preview]][bitwarden-secret-manager-hosting-nuget-preview] | A hosting integration for Bitwarden Secrets Manager projects and managed secrets. | -| - **Learn More**: [`Bitwarden.SecretManager`][bitwarden-secret-manager-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Bitwarden.SecretManager][bitwarden-secret-manager-client-shields]][bitwarden-secret-manager-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Bitwarden.SecretManager][bitwarden-secret-manager-client-shields-preview]][bitwarden-secret-manager-client-nuget-preview] | A client integration for authenticating and using the Bitwarden Secrets Manager SDK from Aspire applications. | -| - **Learn More**: [`Hosting.Perl`][perl-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Perl][perl-shields]][perl-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Perl][perl-shields-preview]][perl-nuget-preview] | A hosting integration for Perl scripts and APIs. | -| - **Learn More**: [`Hosting.Python.Extensions`][python-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Python.Extensions][python-ext-shields]][python-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Python.Extensions][python-ext-shields-preview]][python-ext-nuget-preview] | An integration that contains some additional extensions for running python applications | -| - **Learn More**: [`Hosting.KurrentDB`][kurrentdb-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.KurrentDB][kurrentdb-shields]][kurrentdb-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.KurrentDB][kurrentdb-shields-preview]][kurrentdb-nuget-preview] | An Aspire hosting integration leveraging the [KurrentDB](https://www.kurrent.io) container. | -| - **Learn More**: [`KurrentDB`][kurrentdb-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.KurrentDB][kurrentdb-client-shields]][kurrentdb-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.KurrentDB][kurrentdb-client-shields-preview]][kurrentdb-client-nuget-preview] | An Aspire client integration for the [KurrentDB](https://github.com/kurrent-io/KurrentDB-Client-Dotnet) package. | -| - **Learn More**: [`Hosting.Flagd`][flagd-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Flagd][flagd-shields]][flagd-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Flagd][flagd-shields-preview]][flagd-nuget-preview] | An Aspire hosting integration for [flagd](https://flagd.dev), a feature flag evaluation engine. | -| - **Learn More**: [`Hosting.ActiveMQ`][activemq-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.ActiveMQ][activemq-shields]][activemq-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.ActiveMQ][activemq-shields-preview]][activemq-nuget-preview] | An Aspire hosting integration leveraging the [ActiveMq](https://activemq.apache.org) container. | -| - **Learn More**: [`Hosting.Sqlite`][sqlite-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Sqlite][sqlite-shields]][sqlite-hosting-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Sqlite][sqlite-shields-preview]][sqlite-hosting-nuget-preview] | An Aspire hosting integration to setup a SQLite database with optional SQLite Web as a dev UI. | -| - **Learn More**: [`Microsoft.Data.Sqlite`][sqlite-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Microsoft.Data.Sqlite][sqlite-shields]][sqlite-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Microsoft.Data.Sqlite][sqlite-shields-preview]][sqlite-nuget-preview] | An Aspire client integration for the Microsoft.Data.Sqlite NuGet package. | -| - **Learn More**: [`Microsoft.EntityFrameworkCore.Sqlite`][sqlite-ef-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite][sqlite-ef-shields]][sqlite-ef-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite][sqlite-ef-shields-preview]][sqlite-ef-nuget-preview] | An Aspire client integration for the Microsoft.EntityFrameworkCore.Sqlite NuGet package. | -| - **Learn More**: [`Hosting.Dapr`][dapr-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Dapr][dapr-shields]][dapr-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Dapr][dapr-shields-preview]][dapr-nuget-preview] | An Aspire hosting integration for Dapr. | -| - **Learn More**: [`Hosting.Azure.Dapr.Redis`][dapr-azureredis-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis][dapr-azureredis-shields]][dapr-azureredis-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis][dapr-azureredis-shields-preview]][dapr-azureredis-nuget-preview] | An extension for the Dapr hosting integration for using Dapr with Azure Redis cache. | -| - **Learn More**: [`Hosting.RavenDB`][ravendb-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.RavenDB][ravendb-shields]][ravendb-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.RavenDB][ravendb-shields-preview]][ravendb-nuget-preview] | An Aspire integration leveraging the [RavenDB](https://ravendb.net/) container. | -| - **Learn More**: [`RavenDB.Client`][ravendb-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.RavenDB.Client][ravendb-client-shields]][ravendb-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.RavenDB.Client][ravendb-client-shields-preview]][ravendb-client-nuget-preview] | An Aspire client integration for the [RavenDB.Client](https://www.nuget.org/packages/RavenDB.client) package. | -| - **Learn More**: [`Hosting.GoFeatureFlag`][go-feature-flag-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.GoFeatureFlag][go-feature-flag-shields]][go-feature-flag-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.GoFeatureFlag][go-feature-flag-shields-preview]][go-feature-flag-nuget-preview] | An Aspire hosting integration leveraging the [GoFeatureFlag](https://gofeatureflag.org/) container. | -| - **Learn More**: [`GoFeatureFlag`][go-feature-flag-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.GoFeatureFlag][go-feature-flag-client-shields]][go-feature-flag-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.GoFeatureFlag][go-feature-flag-client-shields-preview]][go-feature-flag-client-nuget-preview] | An Aspire client integration for the [GoFeatureFlag](https://github.com/open-feature/dotnet-sdk-contrib/tree/main/src/OpenFeature.Providers.GOFeatureFlag) package. | -| - **Learn More**: [`Hosting.MongoDB.Extensions`][mongodb-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.MongoDB.Extensions][mongodb-ext-shields]][mongodb-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.MongoDB.Extensions][mongodb-ext-shields-preview]][mongodb-ext-nuget-preview] | An integration that contains some additional extensions for hosting MongoDB container. | -| - **Learn More**: [`Hosting.PostgreSQL.Extensions`][postgres-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.PostgreSQL.Extensions][postgres-ext-shields]][postgres-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions][postgres-ext-shields-preview]][postgres-ext-nuget-preview] | An integration that contains some additional extensions for hosting PostgreSQL container. | -| - **Learn More**: [`Hosting.Redis.Extensions`][redis-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Redis.Extensions][redis-ext-shields]][redis-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Redis.Extensions][redis-ext-shields-preview]][redis-ext-nuget-preview] | An integration that contains some additional extensions for hosting Redis container. | -| - **Learn More**: [`Hosting.SqlServer.Extensions`][sqlserver-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.SqlServer.Extensions][sqlserver-ext-shields]][sqlserver-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.SqlServer.Extensions][sqlserver-ext-shields-preview]][sqlserver-ext-nuget-preview] | An integration that contains some additional extensions for hosting SqlServer container. | -| - **Learn More**: [`Hosting.LavinMQ`][lavinmq-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.LavinMQ][lavinmq-shields]][lavinmq-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.LavinMQ][lavinmq-shields-preview]][lavinmq-nuget-preview] | An Aspire hosting integration for [LavinMQ](https://www.lavinmq.com). | -| - **Learn More**: [`Hosting.MailPit`][mailpit-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.MailPit][mailpit-ext-shields]][mailpit-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.MailPit][mailpit-ext-shields-preview]][mailpit-ext-nuget-preview] | An Aspire integration leveraging the [MailPit](https://mailpit.axllent.org/) container. | -| - **Learn More**: [`Hosting.k6`][k6-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.k6][k6-shields]][k6-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.k6][k6-shields-preview]][k6-nuget-preview] | An Aspire integration leveraging the [Grafana k6](https://k6.io/) container. | -| - **Learn More**: [`Hosting.MySql.Extensions`][mysql-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.MySql.Extensions][mysql-ext-shields]][mysql-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.MySql.Extensions][mysql-ext-shields-preview]][mysql-ext-nuget-preview] | An integration that contains some additional extensions for hosting MySql container. | -| - **Learn More**: [`Hosting.MinIO`][minio-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Minio][minio-hosting-shields]][minio-hosting-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Minio][minio-hosting-shields-preview]][minio-hosting-nuget-preview] | An Aspire hosting integration to setup a [MinIO S3](https://min.io/) storage. | -| - **Learn More**: [`MinIO.Client`][minio-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Minio.Client][minio-client-shields]][minio-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Client.Minio][minio-client-shields-preview]][minio-client-nuget-preview] | An Aspire client integration for the [MinIO](https://github.com/minio/minio-dotnet) package. | -| - **Learn More**: [`Hosting.RustFs`][rustfs-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.RustFs][rustfs-hosting-shields]][rustfs-hosting-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.RustFs][rustfs-hosting-shields-preview]][rustfs-hosting-nuget-preview] | An Aspire hosting integration to setup a [RustFs](https://github.com/rustfs/rustfs) S3-compatible storage. | -| - **Learn More**: [`Hosting.SurrealDb`][surrealdb-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.SurrealDb][surrealdb-shields]][surrealdb-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.SurrealDb][surrealdb-shields-preview]][surrealdb-nuget-preview] | An Aspire hosting integration leveraging the [SurrealDB](https://surrealdb.com/) container. | -| - **Learn More**: [`SurrealDb`][surrealdb-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.SurrealDb][surrealdb-client-shields]][surrealdb-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.SurrealDb][surrealdb-client-shields-preview]][surrealdb-client-nuget-preview] | An Aspire client integration for the [SurrealDB](https://github.com/surrealdb/surrealdb.net/) package. | -| - **Learn More**: [`Hosting.Elasticsearch.Extensions`][elasticsearch-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions][elasticsearch-ext-shields]][elasticsearch-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions][elasticsearch-ext-shields-preview]][elasticsearch-ext-nuget-preview] | An integration that contains some additional extensions for hosting Elasticsearch container. | -| - **Learn More**: [`Hosting.Umami`][umami-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Umami][umami-shields]][umami-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Umami][umami-shields-preview]][umami-nuget-preview] | An Aspire hosting integration leveraging the [Umami](https://umami.is/) container. | -| - **Learn More**: [`Hosting.Azure.Extensions`][azure-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Azure.Extensions][azure-ext-shields]][azure-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Extensions][azure-ext-shields-preview]][azure-ext-nuget-preview] | An integration that contains some additional extensions for hosting Azure container. | -| - **Learn More**: [`Hosting.Squad`][squad-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Squad][squad-shields]][squad-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Squad][squad-shields-preview]][squad-nuget-preview] | An Aspire hosting integration that models a [Squad](https://github.com/bradygaster/squad) AI-agent team as a first-class resource. | + +| Package | Description | +| --- | --- | +| - **Learn More**: [`Bitwarden.SecretManager`](src/CommunityToolkit.Aspire.Bitwarden.SecretManager/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Bitwarden.SecretManager](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Bitwarden.SecretManager)](https://nuget.org/packages/CommunityToolkit.Aspire.Bitwarden.SecretManager/)
- Preview 📦: [![CommunityToolkit.Aspire.Bitwarden.SecretManager](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Bitwarden.SecretManager?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Bitwarden.SecretManager/absoluteLatest) | An Aspire client integration for Bitwarden Secrets Manager. | +| - **Learn More**: [`DuckDB.NET.Data`](src/CommunityToolkit.Aspire.DuckDB.NET.Data/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.DuckDB.NET.Data](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.DuckDB.NET.Data)](https://nuget.org/packages/CommunityToolkit.Aspire.DuckDB.NET.Data/)
- Preview 📦: [![CommunityToolkit.Aspire.DuckDB.NET.Data](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.DuckDB.NET.Data?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.DuckDB.NET.Data/absoluteLatest) | An Aspire client integration for the DuckDB.NET.Data package. | +| - **Learn More**: [`GoFeatureFlag`](src/CommunityToolkit.Aspire.GoFeatureFlag/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.GoFeatureFlag](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.GoFeatureFlag)](https://nuget.org/packages/CommunityToolkit.Aspire.GoFeatureFlag/)
- Preview 📦: [![CommunityToolkit.Aspire.GoFeatureFlag](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.GoFeatureFlag?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.GoFeatureFlag/absoluteLatest) | A GO Feature Flag client that integrates with Aspire, including health checks, logging, and telemetry. | +| - **Learn More**: [`Hosting.ActiveMQ`](src/CommunityToolkit.Aspire.Hosting.ActiveMQ/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.ActiveMQ](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.ActiveMQ)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.ActiveMQ/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.ActiveMQ](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.ActiveMQ?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.ActiveMQ/absoluteLatest) | An Aspire hosting package for hosting ActiveMQ. | +| - **Learn More**: [`Hosting.Adminer`](src/CommunityToolkit.Aspire.Hosting.Adminer/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Adminer](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Adminer)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Adminer/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Adminer](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Adminer?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Adminer/absoluteLatest) | An Aspire hosting integration for the Adminer database management container. | +| - **Learn More**: [`Hosting.Azure.Dapr`](src/CommunityToolkit.Aspire.Hosting.Azure.Dapr/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Dapr](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Azure.Dapr)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Dapr/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Dapr](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Azure.Dapr?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Dapr/absoluteLatest) | Azure Dapr support for Aspire. | +| - **Learn More**: [`Hosting.Azure.Dapr.Redis`](src/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis/absoluteLatest) | An Aspire hosting integration for configuring Azure Cache for Redis as a Dapr state store or pub/sub component in your AppHost. | +| - **Learn More**: [`Hosting.Azure.DataApiBuilder`](src/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder/absoluteLatest) | An Aspire component leveraging the Data API Builder container. | +| - **Learn More**: [`Hosting.Azure.Extensions`](src/CommunityToolkit.Aspire.Hosting.Azure.Extensions/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Extensions](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Azure.Extensions)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Extensions/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Extensions](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Azure.Extensions?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Extensions/absoluteLatest) | Azure extensions support for Aspire. | +| - **Learn More**: [`Hosting.Bitwarden.SecretManager`](src/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager/absoluteLatest) | An Aspire hosting integration for Bitwarden Secrets Manager. | +| - **Learn More**: [`Hosting.Bun`](src/CommunityToolkit.Aspire.Hosting.Bun/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Bun](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Bun)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bun/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Bun](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Bun?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bun/absoluteLatest) | An Aspire integration for hosting Bun apps. DEPRECATED: Use Aspire.Hosting.JavaScript and builder.AddBunApp(...) instead. This package will be removed in a future release. | +| - **Learn More**: [`Hosting.Dapr`](src/CommunityToolkit.Aspire.Hosting.Dapr/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Dapr](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Dapr)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dapr/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Dapr](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Dapr?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dapr/absoluteLatest) | Dapr support for Aspire. | +| - **Learn More**: [`Hosting.DbGate`](src/CommunityToolkit.Aspire.Hosting.DbGate/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.DbGate](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.DbGate)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.DbGate/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.DbGate](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.DbGate?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.DbGate/absoluteLatest) | An Aspire hosting integration for the DbGate database management container. | +| - **Learn More**: [`Hosting.Dbx`](src/CommunityToolkit.Aspire.Hosting.Dbx/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Dbx](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Dbx)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dbx/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Dbx](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Dbx?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dbx/absoluteLatest) | An Aspire hosting integration for the Dbx database management container. | +| - **Learn More**: [`Hosting.Deno`](src/CommunityToolkit.Aspire.Hosting.Deno/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Deno](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Deno)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Deno/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Deno](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Deno?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Deno/absoluteLatest) | An Aspire integration for hosting Deno apps. | +| - **Learn More**: [`Hosting.DuckDB`](src/CommunityToolkit.Aspire.Hosting.DuckDB/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.DuckDB](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.DuckDB)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.DuckDB/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.DuckDB](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.DuckDB?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.DuckDB/absoluteLatest) | An Aspire hosting integration for providing a DuckDB database connection. | +| - **Learn More**: [`Hosting.Elasticsearch.Extensions`](src/CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions/absoluteLatest) | An Aspire hosting integration for extending Elasticsearch resources with additional management tooling. | +| - **Learn More**: [`Hosting.Flagd`](src/CommunityToolkit.Aspire.Hosting.Flagd/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Flagd](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Flagd)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Flagd/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Flagd](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Flagd?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Flagd/absoluteLatest) | flagd is a feature flag evaluation engine. Think of it as a ready-made, open source, OpenFeature-compliant feature flag backend system. | +| - **Learn More**: [`Hosting.Flyway`](src/CommunityToolkit.Aspire.Hosting.Flyway/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Flyway](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Flyway)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Flyway/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Flyway](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Flyway?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Flyway/absoluteLatest) | An Aspire integration for Flyway database migration tool. | +| - **Learn More**: [`Hosting.GoFeatureFlag`](src/CommunityToolkit.Aspire.Hosting.GoFeatureFlag/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.GoFeatureFlag](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.GoFeatureFlag)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.GoFeatureFlag/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.GoFeatureFlag](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.GoFeatureFlag?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.GoFeatureFlag/absoluteLatest) | GO Feature Flag support for Aspire. | +| - **Learn More**: [`Hosting.Golang`](src/CommunityToolkit.Aspire.Hosting.Golang/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Golang](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Golang)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Golang/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Golang](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Golang?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Golang/absoluteLatest) | An Aspire integration for hosting Golang apps. | +| - **Learn More**: [`Hosting.Java`](src/CommunityToolkit.Aspire.Hosting.Java/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Java](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Java)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Java/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Java](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Java?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Java/absoluteLatest) | An Aspire integration for hosting Java apps using either the Java executable or container image. | +| - **Learn More**: [`Hosting.JavaScript.Extensions`](src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.JavaScript.Extensions](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.JavaScript.Extensions](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/absoluteLatest) | An Aspire integration for hosting NodeJS apps using Vite, Yarn, PNPM, or NPM. | +| - **Learn More**: [`Hosting.K3s`](src/CommunityToolkit.Aspire.Hosting.K3s/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.K3s](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.K3s)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.K3s/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.K3s](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.K3s?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.K3s/absoluteLatest) | An Aspire hosting integration for k3s. Provides AddK3sCluster, AddHelmRelease (via alpine/helm), AddK8sManifest with Kustomize support (via alpine/kubectl), and AddServiceEndpoint for in-process WebSocket port-forwarding. No host-side kubectl or helm required. | +| - **Learn More**: [`Hosting.k6`](src/CommunityToolkit.Aspire.Hosting.k6/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.k6](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.k6)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.k6/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.k6](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.k6?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.k6/absoluteLatest) | Grafana k6 support for Aspire. | +| - **Learn More**: [`Hosting.Keycloak.Extensions`](src/CommunityToolkit.Aspire.Hosting.Keycloak.Extensions/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Keycloak.Extensions](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Keycloak.Extensions)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Keycloak.Extensions/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Keycloak.Extensions](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Keycloak.Extensions?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Keycloak.Extensions/absoluteLatest) | Aspire hosting extensions for Keycloak (includes PostgreSQL integration). | +| - **Learn More**: [`Hosting.KurrentDB`](src/CommunityToolkit.Aspire.Hosting.KurrentDB/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.KurrentDB](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.KurrentDB)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.KurrentDB/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.KurrentDB](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.KurrentDB?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.KurrentDB/absoluteLatest) | KurrentDB support for Aspire. | +| - **Learn More**: [`Hosting.LavinMQ`](src/CommunityToolkit.Aspire.Hosting.LavinMQ/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.LavinMQ](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.LavinMQ)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.LavinMQ/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.LavinMQ](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.LavinMQ?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.LavinMQ/absoluteLatest) | An Aspire hosting package for hosting LavinMQ. | +| - **Learn More**: [`Hosting.Listmonk`](src/CommunityToolkit.Aspire.Hosting.Listmonk/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Listmonk](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Listmonk)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Listmonk/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Listmonk](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Listmonk?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Listmonk/absoluteLatest) | listmonk support for Aspire. | +| - **Learn More**: [`Hosting.Logto`](src/CommunityToolkit.Aspire.Hosting.Logto/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Logto](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Logto)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Logto/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Logto](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Logto?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Logto/absoluteLatest) | .NET Aspire hosting extensions for Logto (includes PostgreSQL and Redis integration). | +| - **Learn More**: [`Hosting.MailPit`](src/CommunityToolkit.Aspire.Hosting.MailPit/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.MailPit](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.MailPit)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.MailPit/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.MailPit](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.MailPit?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.MailPit/absoluteLatest) | An Aspire component leveraging the MailPit container. | +| - **Learn More**: [`Hosting.McpInspector`](src/CommunityToolkit.Aspire.Hosting.McpInspector/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.McpInspector](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.McpInspector)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.McpInspector/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.McpInspector](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.McpInspector?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.McpInspector/absoluteLatest) | An Aspire hosting integration to run the MCP Inspector against a Model Context Protocol (MCP) server. | +| - **Learn More**: [`Hosting.Meilisearch`](src/CommunityToolkit.Aspire.Hosting.Meilisearch/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Meilisearch](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Meilisearch)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Meilisearch/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Meilisearch](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Meilisearch?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Meilisearch/absoluteLatest) | Meilisearch support for Aspire. | +| - **Learn More**: [`Hosting.Minio`](src/CommunityToolkit.Aspire.Hosting.Minio/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Minio](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Minio)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Minio/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Minio](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Minio?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Minio/absoluteLatest) | ⚠️ **Deprecated** — An Aspire hosting integration for MinIO. DEPRECATED: The MinIO OSS project has been archived and is no longer maintained. This integration is deprecated and will be removed in a future version. | +| - **Learn More**: [`Hosting.MongoDB.Extensions`](src/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.MongoDB.Extensions](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.MongoDB.Extensions](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions/absoluteLatest) | An Aspire hosting integration for extending MongoDB resources with additional management tooling. | +| - **Learn More**: [`Hosting.MySql.Extensions`](src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.MySql.Extensions](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.MySql.Extensions)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.MySql.Extensions/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.MySql.Extensions](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.MySql.Extensions?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.MySql.Extensions/absoluteLatest) | An Aspire hosting integration for extending MySQL resources with additional management tooling. | +| - **Learn More**: [`Hosting.Ngrok`](src/CommunityToolkit.Aspire.Hosting.Ngrok/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Ngrok](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Ngrok)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Ngrok/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Ngrok](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Ngrok?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Ngrok/absoluteLatest) | An Aspire integration for exposing hosted applications via secure, public URLs using ngrok. | +| - **Learn More**: [`Hosting.Ollama`](src/CommunityToolkit.Aspire.Hosting.Ollama/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Ollama](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Ollama)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Ollama/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Ollama](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Ollama?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Ollama/absoluteLatest) | An Aspire integration leveraging the Ollama container with support for downloading a model on startup. | +| - **Learn More**: [`Hosting.OpenTelemetryCollector`](src/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector/absoluteLatest) | An Aspire hosting integration to add an OpenTelemetry Collector into the OTLP pipeline. | +| - **Learn More**: [`Hosting.PapercutSmtp`](src/CommunityToolkit.Aspire.Hosting.PapercutSmtp/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.PapercutSmtp](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.PapercutSmtp)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PapercutSmtp/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.PapercutSmtp](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.PapercutSmtp?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PapercutSmtp/absoluteLatest) | An Aspire component leveraging Papercut SMTP container. | +| - **Learn More**: [`Hosting.Perl`](src/CommunityToolkit.Aspire.Hosting.Perl/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Perl](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Perl)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Perl/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Perl](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Perl?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Perl/absoluteLatest) | An Aspire hosting integration for hosting Perl apps. | +| - **Learn More**: [`Hosting.PostgreSQL.Extensions`](src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/absoluteLatest) | An Aspire hosting integration for extending PostgreSQL resources with additional management tooling. | +| - **Learn More**: [`Hosting.PowerShell`](src/CommunityToolkit.Aspire.Hosting.PowerShell/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.PowerShell](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.PowerShell)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PowerShell/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.PowerShell](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.PowerShell?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PowerShell/absoluteLatest) | Run powershell scripts in-process with your Aspire AppHost, injecting aspire resources and/or object instances as variables, using the command lines tools of your choice like azure cli, azd, or any other terminal tools. | +| - **Learn More**: [`Hosting.Python.Extensions`](src/CommunityToolkit.Aspire.Hosting.Python.Extensions/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Python.Extensions](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Python.Extensions)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Python.Extensions/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Python.Extensions](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Python.Extensions?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Python.Extensions/absoluteLatest) | An Aspire integration for hosting Uvicorn apps. | +| - **Learn More**: [`Hosting.RavenDB`](src/CommunityToolkit.Aspire.Hosting.RavenDB/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.RavenDB](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.RavenDB)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.RavenDB/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.RavenDB](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.RavenDB?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.RavenDB/absoluteLatest) | An Aspire integration leveraging the RavenDB container. | +| - **Learn More**: [`Hosting.Redis.Extensions`](src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Redis.Extensions](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Redis.Extensions)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Redis.Extensions/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Redis.Extensions](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Redis.Extensions?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Redis.Extensions/absoluteLatest) | An Aspire hosting integration for extending Redis resources with additional management tooling. | +| - **Learn More**: [`Hosting.Rust`](src/CommunityToolkit.Aspire.Hosting.Rust/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Rust](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Rust)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Rust/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Rust](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Rust?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Rust/absoluteLatest) | An Aspire integration for hosting Rust apps. | +| - **Learn More**: [`Hosting.RustFs`](src/CommunityToolkit.Aspire.Hosting.RustFs/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.RustFs](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.RustFs)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.RustFs/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.RustFs](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.RustFs?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.RustFs/absoluteLatest) | An Aspire hosting integration for the RustFS S3-compatible object storage container. | +| - **Learn More**: [`Hosting.SeaweedFS`](src/CommunityToolkit.Aspire.Hosting.SeaweedFS/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.SeaweedFS](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.SeaweedFS)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.SeaweedFS/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.SeaweedFS](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.SeaweedFS?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.SeaweedFS/absoluteLatest) | Provides extension methods and resource definitions for the Aspire AppHost to support running SeaweedFS containers with an S3-compatible API. | +| - **Learn More**: [`Hosting.Sftp`](src/CommunityToolkit.Aspire.Hosting.Sftp/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Sftp](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Sftp)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Sftp/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Sftp](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Sftp?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Sftp/absoluteLatest) | Aspire hosting integration for the atmoz SFTP container image. | +| - **Learn More**: [`Hosting.Solr`](src/CommunityToolkit.Aspire.Hosting.Solr/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Solr](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Solr)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Solr/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Solr](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Solr?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Solr/absoluteLatest) | An Aspire hosting integration for Apache Solr. | +| - **Learn More**: [`Hosting.SqlDatabaseProjects`](src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/absoluteLatest) | An Aspire hosting integration capable of deploying SQL Server Database Projects as part of your AppHost. | +| - **Learn More**: [`Hosting.Sqlite`](src/CommunityToolkit.Aspire.Hosting.Sqlite/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Sqlite](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Sqlite)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Sqlite/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Sqlite](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Sqlite?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Sqlite/absoluteLatest) | An Aspire hosting integration for providing a Sqlite database connection. | +| - **Learn More**: [`Hosting.SqlServer.Extensions`](src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.SqlServer.Extensions](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.SqlServer.Extensions](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/absoluteLatest) | An Aspire hosting integration for extending SQL Server resources with additional management tooling. | +| - **Learn More**: [`Hosting.Squad`](src/CommunityToolkit.Aspire.Hosting.Squad/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Squad](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Squad)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Squad/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Squad](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Squad?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Squad/absoluteLatest) | An Aspire hosting integration for Squad AI-agent teams. Models a `.squad/` workspace as a first-class Aspire resource that auto-discovers the team roster and exposes it via WithReference for downstream services. | +| - **Learn More**: [`Hosting.Stripe`](src/CommunityToolkit.Aspire.Hosting.Stripe/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Stripe](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Stripe)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Stripe/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Stripe](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Stripe?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Stripe/absoluteLatest) | An Aspire integration for the Stripe CLI for local webhook forwarding and testing. | +| - **Learn More**: [`Hosting.SurrealDb`](src/CommunityToolkit.Aspire.Hosting.SurrealDb/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.SurrealDb](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.SurrealDb)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.SurrealDb/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.SurrealDb](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.SurrealDb?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.SurrealDb/absoluteLatest) | SurrealDB support for Aspire. | +| - **Learn More**: [`Hosting.Umami`](src/CommunityToolkit.Aspire.Hosting.Umami/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Umami](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Umami)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Umami/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Umami](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Umami?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Umami/absoluteLatest) | Umami support for Aspire. | +| - **Learn More**: [`Hosting.Zitadel`](src/CommunityToolkit.Aspire.Hosting.Zitadel/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Zitadel](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Zitadel)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Zitadel/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Zitadel](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Zitadel?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Zitadel/absoluteLatest) | An Aspire hosting integration for the ZITADEL identity and access management container. | +| - **Learn More**: [`KurrentDB`](src/CommunityToolkit.Aspire.KurrentDB/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.KurrentDB](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.KurrentDB)](https://nuget.org/packages/CommunityToolkit.Aspire.KurrentDB/)
- Preview 📦: [![CommunityToolkit.Aspire.KurrentDB](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.KurrentDB?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.KurrentDB/absoluteLatest) | A KurrentDB client that integrates with Aspire, including health checks, logging, and telemetry. | +| - **Learn More**: [`Logto.Client`](src/CommunityToolkit.Aspire.Logto.Client/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Logto.Client](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Logto.Client)](https://nuget.org/packages/CommunityToolkit.Aspire.Logto.Client/)
- Preview 📦: [![CommunityToolkit.Aspire.Logto.Client](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Logto.Client?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Logto.Client/absoluteLatest) | An Aspire client integration for Logto that registers OpenID Connect (OIDC) or JWT authentication services in the dependency injection container. | +| - **Learn More**: [`MassTransit.RabbitMQ`](src/CommunityToolkit.Aspire.MassTransit.RabbitMQ/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.MassTransit.RabbitMQ](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.MassTransit.RabbitMQ)](https://nuget.org/packages/CommunityToolkit.Aspire.MassTransit.RabbitMQ/)
- Preview 📦: [![CommunityToolkit.Aspire.MassTransit.RabbitMQ](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.MassTransit.RabbitMQ?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.MassTransit.RabbitMQ/absoluteLatest) | An Aspire client integration for MassTransit RabbitMQ. | +| - **Learn More**: [`Meilisearch`](src/CommunityToolkit.Aspire.Meilisearch/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Meilisearch](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Meilisearch)](https://nuget.org/packages/CommunityToolkit.Aspire.Meilisearch/)
- Preview 📦: [![CommunityToolkit.Aspire.Meilisearch](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Meilisearch?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Meilisearch/absoluteLatest) | A Meilisearch client that integrates with Aspire, including health checks, logging, and telemetry. | +| - **Learn More**: [`Microsoft.Data.Sqlite`](src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Microsoft.Data.Sqlite](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Microsoft.Data.Sqlite)](https://nuget.org/packages/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/)
- Preview 📦: [![CommunityToolkit.Aspire.Microsoft.Data.Sqlite](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Microsoft.Data.Sqlite?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/absoluteLatest) | An Aspire client integration for the Microsoft.Data.Sqlite.Core package. | +| - **Learn More**: [`Microsoft.EntityFrameworkCore.Sqlite`](src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite)](https://nuget.org/packages/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/)
- Preview 📦: [![CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/absoluteLatest) | An Aspire client integration for the Microsoft.EntityFrameworkCore.Sqlite package. | +| - **Learn More**: [`Minio.Client`](src/CommunityToolkit.Aspire.Minio.Client/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Minio.Client](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Minio.Client)](https://nuget.org/packages/CommunityToolkit.Aspire.Minio.Client/)
- Preview 📦: [![CommunityToolkit.Aspire.Minio.Client](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Minio.Client?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Minio.Client/absoluteLatest) | ⚠️ **Deprecated** — An Aspire client integration for MinIO. DEPRECATED: The MinIO OSS project has been archived and is no longer maintained. This integration is deprecated and will be removed in a future version. | +| - **Learn More**: [`OllamaSharp`](src/CommunityToolkit.Aspire.OllamaSharp/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.OllamaSharp](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.OllamaSharp)](https://nuget.org/packages/CommunityToolkit.Aspire.OllamaSharp/)
- Preview 📦: [![CommunityToolkit.Aspire.OllamaSharp](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.OllamaSharp?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.OllamaSharp/absoluteLatest) | An Aspire client integration for the OllamaSharp library. | +| - **Learn More**: [`RavenDB.Client`](src/CommunityToolkit.Aspire.RavenDB.Client/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.RavenDB.Client](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.RavenDB.Client)](https://nuget.org/packages/CommunityToolkit.Aspire.RavenDB.Client/)
- Preview 📦: [![CommunityToolkit.Aspire.RavenDB.Client](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.RavenDB.Client?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.RavenDB.Client/absoluteLatest) | An Aspire client integration for the RavenDB.Client library. | +| - **Learn More**: [`SeaweedFS.Client`](src/CommunityToolkit.Aspire.SeaweedFS.Client/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.SeaweedFS.Client](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.SeaweedFS.Client)](https://nuget.org/packages/CommunityToolkit.Aspire.SeaweedFS.Client/)
- Preview 📦: [![CommunityToolkit.Aspire.SeaweedFS.Client](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.SeaweedFS.Client?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.SeaweedFS.Client/absoluteLatest) | An Aspire client integration for SeaweedFS using the AWSSDK.S3 client. | +| - **Learn More**: [`Sftp`](src/CommunityToolkit.Aspire.Sftp/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Sftp](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Sftp)](https://nuget.org/packages/CommunityToolkit.Aspire.Sftp/)
- Preview 📦: [![CommunityToolkit.Aspire.Sftp](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Sftp?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Sftp/absoluteLatest) | An SFTP client that integrates with Aspire, including health checks, logging, and telemetry. | +| - **Learn More**: [`SurrealDb`](src/CommunityToolkit.Aspire.SurrealDb/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.SurrealDb](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.SurrealDb)](https://nuget.org/packages/CommunityToolkit.Aspire.SurrealDb/)
- Preview 📦: [![CommunityToolkit.Aspire.SurrealDb](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.SurrealDb?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.SurrealDb/absoluteLatest) | A SurrealDB client that integrates with Aspire, including health checks, logging, and telemetry. | + ## 🙌 Getting Started diff --git a/eng/scripts/generate-readme-integrations.py b/eng/scripts/generate-readme-integrations.py new file mode 100755 index 000000000..c5807e901 --- /dev/null +++ b/eng/scripts/generate-readme-integrations.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python3 +"""Generate the integrations table in README.md from src package projects.""" + +from __future__ import annotations + +import argparse +import difflib +import re +import sys +import xml.etree.ElementTree as ET +from dataclasses import dataclass +from pathlib import Path + +TABLE_START = "" +TABLE_END = "" + + +@dataclass(frozen=True) +class Integration: + package_id: str + short_name: str + description: str + readme_path: str + deprecated: bool + + +def _find_repo_root() -> Path: + return Path(__file__).resolve().parents[2] + + +def _read_property(project: ET.ElementTree, name: str) -> str | None: + for element in project.iter(): + if element.tag.endswith(name): + value = (element.text or "").strip() + if value: + return value + return None + + +def _load_integrations(repo_root: Path) -> list[Integration]: + integrations: list[Integration] = [] + + for project_path in sorted(repo_root.glob("src/**/CommunityToolkit.Aspire*.csproj")): + tree = ET.parse(project_path) + project = tree.getroot() + + package_id = _read_property(tree, "PackageId") or project_path.stem + description = _read_property(tree, "Description") + if description is None: + continue + + readme = project_path.parent / "README.md" + readme_rel = readme.relative_to(repo_root).as_posix() if readme.exists() else "" + + deprecated = False + if readme.exists(): + readme_text = readme.read_text(encoding="utf-8", errors="ignore") + deprecated = bool(re.search(r"\bthis integration is deprecated\b", readme_text, re.IGNORECASE)) + + if "|" in description: + description = description.replace("|", "\\|") + + if deprecated: + description = f"⚠️ **Deprecated** — {description}" + + short_name = package_id.removeprefix("CommunityToolkit.Aspire.") + + integrations.append( + Integration( + package_id=package_id, + short_name=short_name, + description=description, + readme_path=readme_rel, + deprecated=deprecated, + ) + ) + + integrations.sort(key=lambda item: item.package_id.lower()) + return integrations + + +def _render_table(integrations: list[Integration]) -> str: + lines: list[str] = [ + "| Package | Description |", + "| --- | --- |", + ] + + for integration in integrations: + docs_link = integration.readme_path or "#" + package = integration.package_id + cell = ( + f"- **Learn More**: [`{integration.short_name}`]({docs_link})
" + f"- Stable 📦: [![{package}](https://img.shields.io/nuget/v/{package})](https://nuget.org/packages/{package}/)
" + f"- Preview 📦: [![{package}](https://img.shields.io/nuget/vpre/{package}?label=nuget%20(preview))](https://nuget.org/packages/{package}/absoluteLatest)" + ) + lines.append(f"| {cell} | {integration.description} |") + + return "\n".join(lines) + + +def _update_readme(content: str, table: str) -> str: + block = f"{TABLE_START}\n{table}\n{TABLE_END}" + + if TABLE_START in content and TABLE_END in content: + pattern = re.compile(rf"{re.escape(TABLE_START)}.*?{re.escape(TABLE_END)}", re.DOTALL) + return pattern.sub(block, content, count=1) + + table_start = content.find("| Package") + section_start = content.find("\n## 🙌 Getting Started") + if table_start == -1 or section_start == -1 or section_start <= table_start: + raise RuntimeError("Unable to locate integrations table section in README.md") + + return content[:table_start] + block + "\n" + content[section_start:] + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--check", action="store_true", help="Check if README integrations table is up to date") + args = parser.parse_args() + + repo_root = _find_repo_root() + readme_path = repo_root / "README.md" + + integrations = _load_integrations(repo_root) + table = _render_table(integrations) + + existing = readme_path.read_text(encoding="utf-8") + updated = _update_readme(existing, table) + + if args.check: + if existing != updated: + diff = "".join( + difflib.unified_diff( + existing.splitlines(keepends=True), + updated.splitlines(keepends=True), + fromfile="README.md", + tofile="README.md (generated)", + ) + ) + print("README integrations table is out of date.") + print("Run: python eng/scripts/generate-readme-integrations.py") + print(diff) + return 1 + + print("README integrations table is up to date.") + return 0 + + if existing != updated: + readme_path.write_text(updated, encoding="utf-8") + print("Updated README integrations table.") + else: + print("README integrations table already up to date.") + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) From 30dc6791e5be793b481f01a050ba49ecc50c3b98 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 9 Jul 2026 05:39:23 +0000 Subject: [PATCH 3/8] ci: enforce autogenerated README integrations list Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> --- .../workflows/readme-integrations-check.yml | 4 ++- README.md | 4 +-- eng/scripts/generate-readme-integrations.py | 31 ++++++++++++------- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/.github/workflows/readme-integrations-check.yml b/.github/workflows/readme-integrations-check.yml index 571d5e97c..c49cba7e9 100644 --- a/.github/workflows/readme-integrations-check.yml +++ b/.github/workflows/readme-integrations-check.yml @@ -5,7 +5,7 @@ on: paths: - README.md - src/**/CommunityToolkit.Aspire*.csproj - - src/**/README.md + - src/CommunityToolkit.Aspire*/README.md - eng/scripts/generate-readme-integrations.py - .github/workflows/readme-integrations-check.yml @@ -13,6 +13,8 @@ jobs: validate-readme-integrations: name: Validate integrations table runs-on: ubuntu-latest + permissions: + contents: read steps: - name: Checkout repository diff --git a/README.md b/README.md index 686aeb9f2..2eebe2f8f 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ This repository contains the source code for the Aspire Community Toolkit, a col | - **Learn More**: [`Hosting.Azure.DataApiBuilder`](src/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder/absoluteLatest) | An Aspire component leveraging the Data API Builder container. | | - **Learn More**: [`Hosting.Azure.Extensions`](src/CommunityToolkit.Aspire.Hosting.Azure.Extensions/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Extensions](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Azure.Extensions)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Extensions/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Extensions](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Azure.Extensions?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.Extensions/absoluteLatest) | Azure extensions support for Aspire. | | - **Learn More**: [`Hosting.Bitwarden.SecretManager`](src/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager/absoluteLatest) | An Aspire hosting integration for Bitwarden Secrets Manager. | -| - **Learn More**: [`Hosting.Bun`](src/CommunityToolkit.Aspire.Hosting.Bun/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Bun](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Bun)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bun/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Bun](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Bun?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bun/absoluteLatest) | An Aspire integration for hosting Bun apps. DEPRECATED: Use Aspire.Hosting.JavaScript and builder.AddBunApp(...) instead. This package will be removed in a future release. | +| - **Learn More**: [`Hosting.Bun`](src/CommunityToolkit.Aspire.Hosting.Bun/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Bun](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Bun)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bun/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Bun](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Bun?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Bun/absoluteLatest) | ⚠️ **Deprecated** — An Aspire integration for hosting Bun apps. DEPRECATED: Use Aspire.Hosting.JavaScript and builder.AddBunApp(...) instead. This package will be removed in a future release. | | - **Learn More**: [`Hosting.Dapr`](src/CommunityToolkit.Aspire.Hosting.Dapr/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Dapr](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Dapr)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dapr/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Dapr](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Dapr?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dapr/absoluteLatest) | Dapr support for Aspire. | | - **Learn More**: [`Hosting.DbGate`](src/CommunityToolkit.Aspire.Hosting.DbGate/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.DbGate](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.DbGate)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.DbGate/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.DbGate](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.DbGate?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.DbGate/absoluteLatest) | An Aspire hosting integration for the DbGate database management container. | | - **Learn More**: [`Hosting.Dbx`](src/CommunityToolkit.Aspire.Hosting.Dbx/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Dbx](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Dbx)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dbx/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Dbx](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Dbx?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Dbx/absoluteLatest) | An Aspire hosting integration for the Dbx database management container. | @@ -58,7 +58,7 @@ This repository contains the source code for the Aspire Community Toolkit, a col | - **Learn More**: [`Hosting.Perl`](src/CommunityToolkit.Aspire.Hosting.Perl/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Perl](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Perl)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Perl/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Perl](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Perl?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Perl/absoluteLatest) | An Aspire hosting integration for hosting Perl apps. | | - **Learn More**: [`Hosting.PostgreSQL.Extensions`](src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/absoluteLatest) | An Aspire hosting integration for extending PostgreSQL resources with additional management tooling. | | - **Learn More**: [`Hosting.PowerShell`](src/CommunityToolkit.Aspire.Hosting.PowerShell/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.PowerShell](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.PowerShell)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PowerShell/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.PowerShell](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.PowerShell?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.PowerShell/absoluteLatest) | Run powershell scripts in-process with your Aspire AppHost, injecting aspire resources and/or object instances as variables, using the command lines tools of your choice like azure cli, azd, or any other terminal tools. | -| - **Learn More**: [`Hosting.Python.Extensions`](src/CommunityToolkit.Aspire.Hosting.Python.Extensions/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Python.Extensions](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Python.Extensions)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Python.Extensions/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Python.Extensions](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Python.Extensions?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Python.Extensions/absoluteLatest) | An Aspire integration for hosting Uvicorn apps. | +| - **Learn More**: [`Hosting.Python.Extensions`](src/CommunityToolkit.Aspire.Hosting.Python.Extensions/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Python.Extensions](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Python.Extensions)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Python.Extensions/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Python.Extensions](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Python.Extensions?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Python.Extensions/absoluteLatest) | ⚠️ **Deprecated** — An Aspire integration for hosting Uvicorn apps. | | - **Learn More**: [`Hosting.RavenDB`](src/CommunityToolkit.Aspire.Hosting.RavenDB/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.RavenDB](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.RavenDB)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.RavenDB/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.RavenDB](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.RavenDB?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.RavenDB/absoluteLatest) | An Aspire integration leveraging the RavenDB container. | | - **Learn More**: [`Hosting.Redis.Extensions`](src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Redis.Extensions](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Redis.Extensions)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Redis.Extensions/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Redis.Extensions](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Redis.Extensions?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Redis.Extensions/absoluteLatest) | An Aspire hosting integration for extending Redis resources with additional management tooling. | | - **Learn More**: [`Hosting.Rust`](src/CommunityToolkit.Aspire.Hosting.Rust/README.md)
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Rust](https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Rust)](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Rust/)
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Rust](https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Rust?label=nuget%20(preview))](https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Rust/absoluteLatest) | An Aspire integration for hosting Rust apps. | diff --git a/eng/scripts/generate-readme-integrations.py b/eng/scripts/generate-readme-integrations.py index c5807e901..76685f03b 100755 --- a/eng/scripts/generate-readme-integrations.py +++ b/eng/scripts/generate-readme-integrations.py @@ -28,8 +28,8 @@ def _find_repo_root() -> Path: return Path(__file__).resolve().parents[2] -def _read_property(project: ET.ElementTree, name: str) -> str | None: - for element in project.iter(): +def _read_property(tree: ET.ElementTree, name: str) -> str | None: + for element in tree.iter(): if element.tag.endswith(name): value = (element.text or "").strip() if value: @@ -54,8 +54,11 @@ def _load_integrations(repo_root: Path) -> list[Integration]: deprecated = False if readme.exists(): - readme_text = readme.read_text(encoding="utf-8", errors="ignore") - deprecated = bool(re.search(r"\bthis integration is deprecated\b", readme_text, re.IGNORECASE)) + readme_text = readme.read_text(encoding="utf-8", errors="replace") + deprecated = bool( + re.search(r"\bdeprecation notice\b", readme_text, re.IGNORECASE) + or re.search(r"\bthis (?:package|integration) is deprecated(?:\b| as of)", readme_text, re.IGNORECASE) + ) if "|" in description: description = description.replace("|", "\\|") @@ -88,10 +91,12 @@ def _render_table(integrations: list[Integration]) -> str: for integration in integrations: docs_link = integration.readme_path or "#" package = integration.package_id - cell = ( - f"- **Learn More**: [`{integration.short_name}`]({docs_link})
" - f"- Stable 📦: [![{package}](https://img.shields.io/nuget/v/{package})](https://nuget.org/packages/{package}/)
" - f"- Preview 📦: [![{package}](https://img.shields.io/nuget/vpre/{package}?label=nuget%20(preview))](https://nuget.org/packages/{package}/absoluteLatest)" + cell = "
".join( + [ + f"- **Learn More**: [`{integration.short_name}`]({docs_link})", + f"- Stable 📦: [![{package}](https://img.shields.io/nuget/v/{package})](https://nuget.org/packages/{package}/)", + f"- Preview 📦: [![{package}](https://img.shields.io/nuget/vpre/{package}?label=nuget%20(preview))](https://nuget.org/packages/{package}/absoluteLatest)", + ] ) lines.append(f"| {cell} | {integration.description} |") @@ -107,8 +112,12 @@ def _update_readme(content: str, table: str) -> str: table_start = content.find("| Package") section_start = content.find("\n## 🙌 Getting Started") - if table_start == -1 or section_start == -1 or section_start <= table_start: - raise RuntimeError("Unable to locate integrations table section in README.md") + if table_start == -1: + raise RuntimeError("Unable to locate '| Package' header in README.md") + if section_start == -1: + raise RuntimeError("Unable to locate '## 🙌 Getting Started' section in README.md") + if section_start <= table_start: + raise RuntimeError("Integrations table appears after the getting started section in README.md") return content[:table_start] + block + "\n" + content[section_start:] @@ -124,7 +133,7 @@ def main() -> int: integrations = _load_integrations(repo_root) table = _render_table(integrations) - existing = readme_path.read_text(encoding="utf-8") + existing = readme_path.read_text(encoding="utf-8", errors="replace") updated = _update_readme(existing, table) if args.check: From ed5a4ea14b7adb3ff462f65c6afc1b5c50da3d9a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 9 Jul 2026 05:46:11 +0000 Subject: [PATCH 4/8] Replace README integrations generator with C# file-based app Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> --- .../workflows/readme-integrations-check.yml | 9 +- eng/scripts/generate-readme-integrations.cs | 227 ++++++++++++++++++ eng/scripts/generate-readme-integrations.py | 167 ------------- 3 files changed, 229 insertions(+), 174 deletions(-) create mode 100644 eng/scripts/generate-readme-integrations.cs delete mode 100755 eng/scripts/generate-readme-integrations.py diff --git a/.github/workflows/readme-integrations-check.yml b/.github/workflows/readme-integrations-check.yml index c49cba7e9..91f64b9d4 100644 --- a/.github/workflows/readme-integrations-check.yml +++ b/.github/workflows/readme-integrations-check.yml @@ -6,7 +6,7 @@ on: - README.md - src/**/CommunityToolkit.Aspire*.csproj - src/CommunityToolkit.Aspire*/README.md - - eng/scripts/generate-readme-integrations.py + - eng/scripts/generate-readme-integrations.cs - .github/workflows/readme-integrations-check.yml jobs: @@ -20,10 +20,5 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.x' - - name: Verify README integrations table is up to date - run: python eng/scripts/generate-readme-integrations.py --check + run: dotnet run eng/scripts/generate-readme-integrations.cs -- --check diff --git a/eng/scripts/generate-readme-integrations.cs b/eng/scripts/generate-readme-integrations.cs new file mode 100644 index 000000000..6c3a1dcef --- /dev/null +++ b/eng/scripts/generate-readme-integrations.cs @@ -0,0 +1,227 @@ +#!/usr/bin/env dotnet run + +using System.Diagnostics; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml.Linq; + +const string TableStart = ""; +const string TableEnd = ""; + +bool checkOnly = args.Contains("--check", StringComparer.OrdinalIgnoreCase); +string repoRoot = FindRepoRoot(); +string readmePath = Path.Combine(repoRoot, "README.md"); + +List integrations = LoadIntegrations(repoRoot); +string table = RenderTable(integrations); + +string existing = File.ReadAllText(readmePath); +string updated = UpdateReadme(existing, table); + +if (checkOnly) +{ + if (!string.Equals(existing, updated, StringComparison.Ordinal)) + { + Console.WriteLine("README integrations table is out of date."); + Console.WriteLine("Run: dotnet run eng/scripts/generate-readme-integrations.cs"); + Console.WriteLine(CreateDiff(existing, updated)); + return 1; + } + + Console.WriteLine("README integrations table is up to date."); + return 0; +} + +if (!string.Equals(existing, updated, StringComparison.Ordinal)) +{ + File.WriteAllText(readmePath, updated); + Console.WriteLine("Updated README integrations table."); +} +else +{ + Console.WriteLine("README integrations table already up to date."); +} + +return 0; + +static string FindRepoRoot() +{ + string? current = Directory.GetCurrentDirectory(); + + while (current is not null) + { + if (File.Exists(Path.Combine(current, "README.md")) && + Directory.Exists(Path.Combine(current, "src"))) + { + return current; + } + + DirectoryInfo? parent = Directory.GetParent(current); + current = parent?.FullName; + } + + throw new InvalidOperationException("Unable to locate repository root."); +} + +static List LoadIntegrations(string repoRoot) +{ + List integrations = []; + Regex deprecationRegex = new(@"\bdeprecation notice\b|\bthis (?:package|integration) is deprecated(?:\b| as of)", RegexOptions.IgnoreCase); + + foreach (string projectPath in Directory.EnumerateFiles(Path.Combine(repoRoot, "src"), "CommunityToolkit.Aspire*.csproj", SearchOption.AllDirectories).OrderBy(static path => path, StringComparer.OrdinalIgnoreCase)) + { + XDocument project = XDocument.Load(projectPath); + string packageId = ReadProperty(project, "PackageId") ?? Path.GetFileNameWithoutExtension(projectPath); + string? description = ReadProperty(project, "Description"); + if (string.IsNullOrWhiteSpace(description)) + { + continue; + } + + string readmePath = Path.Combine(Path.GetDirectoryName(projectPath)!, "README.md"); + string readmeRelativePath = File.Exists(readmePath) + ? Path.GetRelativePath(repoRoot, readmePath).Replace('\\', '/') + : string.Empty; + + bool deprecated = false; + if (File.Exists(readmePath)) + { + string readmeText = File.ReadAllText(readmePath); + deprecated = deprecationRegex.IsMatch(readmeText); + } + + string normalizedDescription = description.Replace("|", "\\|", StringComparison.Ordinal); + if (deprecated) + { + normalizedDescription = $"⚠️ **Deprecated** — {normalizedDescription}"; + } + + string shortName = packageId.StartsWith("CommunityToolkit.Aspire.", StringComparison.Ordinal) + ? packageId["CommunityToolkit.Aspire.".Length..] + : packageId; + + integrations.Add(new Integration(packageId, shortName, normalizedDescription, readmeRelativePath)); + } + + return integrations.OrderBy(static integration => integration.PackageId, StringComparer.OrdinalIgnoreCase).ToList(); +} + +static string? ReadProperty(XDocument project, string propertyName) +{ + foreach (XElement element in project.Descendants()) + { + if (string.Equals(element.Name.LocalName, propertyName, StringComparison.Ordinal)) + { + string value = element.Value.Trim(); + if (!string.IsNullOrEmpty(value)) + { + return value; + } + } + } + + return null; +} + +static string RenderTable(List integrations) +{ + List lines = + [ + "| Package | Description |", + "| --- | --- |" + ]; + + foreach (Integration integration in integrations) + { + string docsLink = string.IsNullOrEmpty(integration.ReadmePath) ? "#" : integration.ReadmePath; + string package = integration.PackageId; + string cell = string.Join("
", new[] + { + $"- **Learn More**: [`{integration.ShortName}`]({docsLink})", + $"- Stable 📦: [![{package}](https://img.shields.io/nuget/v/{package})](https://nuget.org/packages/{package}/)", + $"- Preview 📦: [![{package}](https://img.shields.io/nuget/vpre/{package}?label=nuget%20(preview))](https://nuget.org/packages/{package}/absoluteLatest)" + }); + + lines.Add($"| {cell} | {integration.Description} |"); + } + + return string.Join('\n', lines); +} + +static string UpdateReadme(string content, string table) +{ + string block = $"{TableStart}\n{table}\n{TableEnd}"; + + if (content.Contains(TableStart, StringComparison.Ordinal) && content.Contains(TableEnd, StringComparison.Ordinal)) + { + Regex pattern = new($"{Regex.Escape(TableStart)}.*?{Regex.Escape(TableEnd)}", RegexOptions.Singleline); + return pattern.Replace(content, block, 1); + } + + int tableStart = content.IndexOf("| Package", StringComparison.Ordinal); + int sectionStart = content.IndexOf("\n## 🙌 Getting Started", StringComparison.Ordinal); + if (tableStart < 0) + { + throw new InvalidOperationException("Unable to locate '| Package' header in README.md"); + } + + if (sectionStart < 0) + { + throw new InvalidOperationException("Unable to locate '## 🙌 Getting Started' section in README.md"); + } + + if (sectionStart <= tableStart) + { + throw new InvalidOperationException("Integrations table appears after the getting started section in README.md"); + } + + return string.Concat(content.AsSpan(0, tableStart), block, "\n", content.AsSpan(sectionStart)); +} + +static string CreateDiff(string existing, string updated) +{ + string tempDirectory = Path.Combine(Path.GetTempPath(), "readme-integrations-diff-" + Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(tempDirectory); + + string existingPath = Path.Combine(tempDirectory, "README.md"); + string generatedPath = Path.Combine(tempDirectory, "README.generated.md"); + File.WriteAllText(existingPath, existing); + File.WriteAllText(generatedPath, updated); + + try + { + ProcessStartInfo startInfo = new() + { + FileName = "git", + ArgumentList = { "diff", "--no-index", "--", existingPath, generatedPath }, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false + }; + + using Process? process = Process.Start(startInfo); + if (process is null) + { + return "(Unable to create diff output.)"; + } + + string output = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + + if (string.IsNullOrWhiteSpace(output)) + { + string fallback = process.StandardError.ReadToEnd(); + return string.IsNullOrWhiteSpace(fallback) ? "(Unable to create diff output.)" : fallback; + } + + return output + .Replace(existingPath, "README.md", StringComparison.Ordinal) + .Replace(generatedPath, "README.md (generated)", StringComparison.Ordinal); + } + finally + { + Directory.Delete(tempDirectory, recursive: true); + } +} + +internal sealed record Integration(string PackageId, string ShortName, string Description, string ReadmePath); diff --git a/eng/scripts/generate-readme-integrations.py b/eng/scripts/generate-readme-integrations.py deleted file mode 100755 index 76685f03b..000000000 --- a/eng/scripts/generate-readme-integrations.py +++ /dev/null @@ -1,167 +0,0 @@ -#!/usr/bin/env python3 -"""Generate the integrations table in README.md from src package projects.""" - -from __future__ import annotations - -import argparse -import difflib -import re -import sys -import xml.etree.ElementTree as ET -from dataclasses import dataclass -from pathlib import Path - -TABLE_START = "" -TABLE_END = "" - - -@dataclass(frozen=True) -class Integration: - package_id: str - short_name: str - description: str - readme_path: str - deprecated: bool - - -def _find_repo_root() -> Path: - return Path(__file__).resolve().parents[2] - - -def _read_property(tree: ET.ElementTree, name: str) -> str | None: - for element in tree.iter(): - if element.tag.endswith(name): - value = (element.text or "").strip() - if value: - return value - return None - - -def _load_integrations(repo_root: Path) -> list[Integration]: - integrations: list[Integration] = [] - - for project_path in sorted(repo_root.glob("src/**/CommunityToolkit.Aspire*.csproj")): - tree = ET.parse(project_path) - project = tree.getroot() - - package_id = _read_property(tree, "PackageId") or project_path.stem - description = _read_property(tree, "Description") - if description is None: - continue - - readme = project_path.parent / "README.md" - readme_rel = readme.relative_to(repo_root).as_posix() if readme.exists() else "" - - deprecated = False - if readme.exists(): - readme_text = readme.read_text(encoding="utf-8", errors="replace") - deprecated = bool( - re.search(r"\bdeprecation notice\b", readme_text, re.IGNORECASE) - or re.search(r"\bthis (?:package|integration) is deprecated(?:\b| as of)", readme_text, re.IGNORECASE) - ) - - if "|" in description: - description = description.replace("|", "\\|") - - if deprecated: - description = f"⚠️ **Deprecated** — {description}" - - short_name = package_id.removeprefix("CommunityToolkit.Aspire.") - - integrations.append( - Integration( - package_id=package_id, - short_name=short_name, - description=description, - readme_path=readme_rel, - deprecated=deprecated, - ) - ) - - integrations.sort(key=lambda item: item.package_id.lower()) - return integrations - - -def _render_table(integrations: list[Integration]) -> str: - lines: list[str] = [ - "| Package | Description |", - "| --- | --- |", - ] - - for integration in integrations: - docs_link = integration.readme_path or "#" - package = integration.package_id - cell = "
".join( - [ - f"- **Learn More**: [`{integration.short_name}`]({docs_link})", - f"- Stable 📦: [![{package}](https://img.shields.io/nuget/v/{package})](https://nuget.org/packages/{package}/)", - f"- Preview 📦: [![{package}](https://img.shields.io/nuget/vpre/{package}?label=nuget%20(preview))](https://nuget.org/packages/{package}/absoluteLatest)", - ] - ) - lines.append(f"| {cell} | {integration.description} |") - - return "\n".join(lines) - - -def _update_readme(content: str, table: str) -> str: - block = f"{TABLE_START}\n{table}\n{TABLE_END}" - - if TABLE_START in content and TABLE_END in content: - pattern = re.compile(rf"{re.escape(TABLE_START)}.*?{re.escape(TABLE_END)}", re.DOTALL) - return pattern.sub(block, content, count=1) - - table_start = content.find("| Package") - section_start = content.find("\n## 🙌 Getting Started") - if table_start == -1: - raise RuntimeError("Unable to locate '| Package' header in README.md") - if section_start == -1: - raise RuntimeError("Unable to locate '## 🙌 Getting Started' section in README.md") - if section_start <= table_start: - raise RuntimeError("Integrations table appears after the getting started section in README.md") - - return content[:table_start] + block + "\n" + content[section_start:] - - -def main() -> int: - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--check", action="store_true", help="Check if README integrations table is up to date") - args = parser.parse_args() - - repo_root = _find_repo_root() - readme_path = repo_root / "README.md" - - integrations = _load_integrations(repo_root) - table = _render_table(integrations) - - existing = readme_path.read_text(encoding="utf-8", errors="replace") - updated = _update_readme(existing, table) - - if args.check: - if existing != updated: - diff = "".join( - difflib.unified_diff( - existing.splitlines(keepends=True), - updated.splitlines(keepends=True), - fromfile="README.md", - tofile="README.md (generated)", - ) - ) - print("README integrations table is out of date.") - print("Run: python eng/scripts/generate-readme-integrations.py") - print(diff) - return 1 - - print("README integrations table is up to date.") - return 0 - - if existing != updated: - readme_path.write_text(updated, encoding="utf-8") - print("Updated README integrations table.") - else: - print("README integrations table already up to date.") - - return 0 - - -if __name__ == "__main__": - sys.exit(main()) From ff672274b8c5f053d4c2157643bfc7654c039d9c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 9 Jul 2026 05:49:49 +0000 Subject: [PATCH 5/8] Polish C# README generator script structure Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> --- eng/scripts/generate-readme-integrations.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/eng/scripts/generate-readme-integrations.cs b/eng/scripts/generate-readme-integrations.cs index 6c3a1dcef..ed0f50485 100644 --- a/eng/scripts/generate-readme-integrations.cs +++ b/eng/scripts/generate-readme-integrations.cs @@ -1,7 +1,4 @@ -#!/usr/bin/env dotnet run - using System.Diagnostics; -using System.Text; using System.Text.RegularExpressions; using System.Xml.Linq; @@ -68,7 +65,12 @@ static List LoadIntegrations(string repoRoot) List integrations = []; Regex deprecationRegex = new(@"\bdeprecation notice\b|\bthis (?:package|integration) is deprecated(?:\b| as of)", RegexOptions.IgnoreCase); - foreach (string projectPath in Directory.EnumerateFiles(Path.Combine(repoRoot, "src"), "CommunityToolkit.Aspire*.csproj", SearchOption.AllDirectories).OrderBy(static path => path, StringComparer.OrdinalIgnoreCase)) + IEnumerable projectFiles = Directory.EnumerateFiles( + Path.Combine(repoRoot, "src"), + "CommunityToolkit.Aspire*.csproj", + SearchOption.AllDirectories); + + foreach (string projectPath in projectFiles.OrderBy(static path => path, StringComparer.OrdinalIgnoreCase)) { XDocument project = XDocument.Load(projectPath); string packageId = ReadProperty(project, "PackageId") ?? Path.GetFileNameWithoutExtension(projectPath); From 1775e4a64a5f4c53ff5a565f00344b4465bb8ce8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 9 Jul 2026 05:58:48 +0000 Subject: [PATCH 6/8] Fix github-script core redeclaration in integration codeowner workflow Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> --- .github/workflows/integration-codeowner.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/integration-codeowner.yml b/.github/workflows/integration-codeowner.yml index 4562423b0..826a24d41 100644 --- a/.github/workflows/integration-codeowner.yml +++ b/.github/workflows/integration-codeowner.yml @@ -19,8 +19,6 @@ jobs: uses: actions/github-script@v9.0.0 with: script: | - const core = require('@actions/core'); - const pr = context.payload.pull_request; const files = await github.paginate(github.rest.pulls.listFiles, { owner: context.repo.owner, @@ -101,8 +99,6 @@ jobs: uses: actions/github-script@v9.0.0 with: script: | - const core = require('@actions/core'); - const comment = context.payload.comment; const command = comment.body.trim(); const accepted = command === '/codeowner-accept'; From ccbfca102b0a73ab7cd2ed0523283c6c11099ffc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 10 Jul 2026 04:32:39 +0000 Subject: [PATCH 7/8] Refactor README generator table rendering to StringBuilder Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> --- eng/scripts/generate-readme-integrations.cs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/eng/scripts/generate-readme-integrations.cs b/eng/scripts/generate-readme-integrations.cs index ed0f50485..f766931c4 100644 --- a/eng/scripts/generate-readme-integrations.cs +++ b/eng/scripts/generate-readme-integrations.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.Text; using System.Text.RegularExpressions; using System.Xml.Linq; @@ -127,11 +128,9 @@ static List LoadIntegrations(string repoRoot) static string RenderTable(List integrations) { - List lines = - [ - "| Package | Description |", - "| --- | --- |" - ]; + StringBuilder lines = new(); + lines.AppendLine("| Package | Description |"); + lines.AppendLine("| --- | --- |"); foreach (Integration integration in integrations) { @@ -144,10 +143,10 @@ static string RenderTable(List integrations) $"- Preview 📦: [![{package}](https://img.shields.io/nuget/vpre/{package}?label=nuget%20(preview))](https://nuget.org/packages/{package}/absoluteLatest)" }); - lines.Add($"| {cell} | {integration.Description} |"); + lines.AppendLine($"| {cell} | {integration.Description} |"); } - return string.Join('\n', lines); + return lines.ToString().TrimEnd('\r', '\n'); } static string UpdateReadme(string content, string table) From d42308b1ffe3190d19b02f78084df83e51b66827 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 10 Jul 2026 04:36:20 +0000 Subject: [PATCH 8/8] Refine StringBuilder table rendering newline behavior Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> --- eng/scripts/generate-readme-integrations.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/eng/scripts/generate-readme-integrations.cs b/eng/scripts/generate-readme-integrations.cs index f766931c4..5c1248f3a 100644 --- a/eng/scripts/generate-readme-integrations.cs +++ b/eng/scripts/generate-readme-integrations.cs @@ -129,8 +129,8 @@ static List LoadIntegrations(string repoRoot) static string RenderTable(List integrations) { StringBuilder lines = new(); - lines.AppendLine("| Package | Description |"); - lines.AppendLine("| --- | --- |"); + lines.Append("| Package | Description |\n"); + lines.Append("| --- | --- |"); foreach (Integration integration in integrations) { @@ -143,10 +143,11 @@ static string RenderTable(List integrations) $"- Preview 📦: [![{package}](https://img.shields.io/nuget/vpre/{package}?label=nuget%20(preview))](https://nuget.org/packages/{package}/absoluteLatest)" }); - lines.AppendLine($"| {cell} | {integration.Description} |"); + lines.Append('\n'); + lines.Append($"| {cell} | {integration.Description} |"); } - return lines.ToString().TrimEnd('\r', '\n'); + return lines.ToString(); } static string UpdateReadme(string content, string table)