Skip to content

Automate README integrations index generation and enforce drift checks on PRs#1464

Open
aaronpowell with Copilot wants to merge 6 commits into
mainfrom
copilot/review-documentation-integrations
Open

Automate README integrations index generation and enforce drift checks on PRs#1464
aaronpowell with Copilot wants to merge 6 commits into
mainfrom
copilot/review-documentation-integrations

Conversation

Copilot AI commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

The root README integrations list had drifted from the actual package set (e.g., missing SeaweedFS), and deprecated integrations were not consistently surfaced. This change makes the list generated from source projects and enforces freshness in PRs.

  • Autogenerated integrations table in README.md

    • Replaced the hand-maintained package rows with a bounded autogenerated region:
      • <!-- BEGIN AUTOGENERATED INTEGRATIONS TABLE -->
      • <!-- END AUTOGENERATED INTEGRATIONS TABLE -->
    • Table is now derived from src/**/CommunityToolkit.Aspire*.csproj and sorted alphabetically by package ID.
    • Includes all integration packages currently in src/ (hosting/client/extensions).
  • Generator script for repeatable updates

    • Added eng/scripts/generate-readme-integrations.py.
    • Builds each row with Learn More, stable badge/link, preview badge/link, and package description.
    • Detects deprecation markers from integration READMEs and prefixes matching entries with ⚠️ **Deprecated** — ....
  • PR-time drift detection workflow

    • Added .github/workflows/readme-integrations-check.yml.
    • On relevant PR changes, runs:
      python eng/scripts/generate-readme-integrations.py --check
    • Fails with a diff + remediation command when README is stale, giving submitters immediate actionable feedback.
    • Uses explicit least-privilege workflow permissions (contents: read).

Copilot AI changed the title [WIP] Review documentation for integrations and deprecated packages Automate README integrations index generation and enforce drift checks on PRs Jul 9, 2026
Copilot AI requested a review from aaronpowell July 9, 2026 05:40
@aaronpowell

Copy link
Copy Markdown
Member

@copilot can you do it as a C# file-based app rather than Python?

Copilot AI commented Jul 9, 2026

Copy link
Copy Markdown
Contributor Author

@copilot can you do it as a C# file-based app rather than Python?

Done in ed5a4ea (with a small follow-up cleanup in ff67227). The README integrations generator is now a C# file-based app at eng/scripts/generate-readme-integrations.cs, and the workflow now runs dotnet run eng/scripts/generate-readme-integrations.cs -- --check.

@aaronpowell aaronpowell marked this pull request as ready for review July 9, 2026 05:52
Copilot AI review requested due to automatic review settings July 9, 2026 05:52
@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/CommunityToolkit/Aspire/main/eng/scripts/dogfood-pr.sh | bash -s -- 1464

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/CommunityToolkit/Aspire/main/eng/scripts/dogfood-pr.ps1) } 1464"

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR makes the root README.md integrations list reproducible by generating it from the src/**/CommunityToolkit.Aspire*.csproj set, and adds CI enforcement to prevent drift.

Changes:

  • Replaced the hand-maintained README integrations rows with a bounded autogenerated region (BEGIN/END markers).
  • Added a C# generator script to render the integrations table from project metadata (and flag deprecated integrations based on README text).
  • Added a PR workflow to fail when the README’s generated table is stale.
Show a summary per file
File Description
README.md Replaces manual integrations table with an autogenerated block controlled by BEGIN/END markers.
eng/scripts/generate-readme-integrations.cs Adds generator/check script to render and/or validate the README integrations table.
.github/workflows/readme-integrations-check.yml Adds PR-time drift detection by running the generator in --check mode.

Review details

  • Files reviewed: 3/3 changed files
  • Comments generated: 2
  • Review effort level: Low

Comment on lines +19 to +24
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Verify README integrations table is up to date
run: dotnet run eng/scripts/generate-readme-integrations.cs -- --check
Comment on lines +23 to +24
- name: Verify README integrations table is up to date
run: dotnet run eng/scripts/generate-readme-integrations.cs -- --check
@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Code Coverage

Package Line Rate Branch Rate Complexity Health
CommunityToolkit.Aspire.Bitwarden.SecretManager 54% 38% 52
CommunityToolkit.Aspire.DuckDB.Api 99% 100% 13
CommunityToolkit.Aspire.DuckDB.NET.Data 67% 77% 32
CommunityToolkit.Aspire.GoFeatureFlag 100% 97% 44
CommunityToolkit.Aspire.Hosting.ActiveMQ 88% 48% 95
CommunityToolkit.Aspire.Hosting.ActiveMQ.MassTransit 100% 100% 15
CommunityToolkit.Aspire.Hosting.Adminer 89% 70% 20
CommunityToolkit.Aspire.Hosting.Azure.Dapr 28% 5% 38
CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis 56% 46% 26
CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder 85% 83% 18
CommunityToolkit.Aspire.Hosting.Azure.Extensions 64% 30% 27
CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager 59% 51% 777
CommunityToolkit.Aspire.Hosting.Bun 88% 69% 20
CommunityToolkit.Aspire.Hosting.Dapr 43% 25% 648
CommunityToolkit.Aspire.Hosting.DbGate 96% 62% 12
CommunityToolkit.Aspire.Hosting.Dbx 94% 59% 68
CommunityToolkit.Aspire.Hosting.Deno 95% 85% 24
CommunityToolkit.Aspire.Hosting.DuckDB 98% 90% 16
CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions 100% 94% 30
CommunityToolkit.Aspire.Hosting.Flagd 80% 100% 16
CommunityToolkit.Aspire.Hosting.Flyway 88% 100% 6
CommunityToolkit.Aspire.Hosting.GoFeatureFlag 80% 50% 24
CommunityToolkit.Aspire.Hosting.GoFeatureFlag.ApiService 100% 100% 3
CommunityToolkit.Aspire.Hosting.Java 86% 75% 207
CommunityToolkit.Aspire.Hosting.Java.ApiApp 65% 50% 11
CommunityToolkit.Aspire.Hosting.Java.WebApp 25% 18% 59
CommunityToolkit.Aspire.Hosting.JavaScript.Extensions 92% 83% 190
CommunityToolkit.Aspire.Hosting.K3s 76% 58% 316
CommunityToolkit.Aspire.Hosting.k6 70% 10% 8
CommunityToolkit.Aspire.Hosting.k6.ApiService 64% 67% 13
CommunityToolkit.Aspire.Hosting.Keycloak.Extensions 100% 100% 11
CommunityToolkit.Aspire.Hosting.KurrentDB 88% 100% 19
CommunityToolkit.Aspire.Hosting.LavinMQ 90% 83% 18
CommunityToolkit.Aspire.Hosting.LavinMQ.MassTransit 100% 100% 15
CommunityToolkit.Aspire.Hosting.Listmonk 95% 100% 24
CommunityToolkit.Aspire.Hosting.Logto 73% 67% 24
CommunityToolkit.Aspire.Hosting.MailPit 91% 100% 13
CommunityToolkit.Aspire.Hosting.McpInspector 85% 60% 100
CommunityToolkit.Aspire.Hosting.McpInspector.McpServer 89% 100% 2
CommunityToolkit.Aspire.Hosting.Meilisearch 95% 85% 30
CommunityToolkit.Aspire.Hosting.Meilisearch.ApiService 82% 100% 15
CommunityToolkit.Aspire.Hosting.Minio 99% 91% 32
CommunityToolkit.Aspire.Hosting.Minio.ApiService 98% 92% 15
CommunityToolkit.Aspire.Hosting.MongoDB.Extensions 88% 81% 18
CommunityToolkit.Aspire.Hosting.MySql.Extensions 94% 88% 44
CommunityToolkit.Aspire.Hosting.Ngrok 55% 43% 106
CommunityToolkit.Aspire.Hosting.Ollama 77% 67% 267
CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector 79% 70% 42
CommunityToolkit.Aspire.Hosting.PapercutSmtp 100% 100% 9
CommunityToolkit.Aspire.Hosting.Perl 88% 79% 745
CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions 91% 87% 54
CommunityToolkit.Aspire.Hosting.PowerShell 76% 59% 107
CommunityToolkit.Aspire.Hosting.Python.Extensions 46% 31% 44
CommunityToolkit.Aspire.Hosting.RavenDB 69% 49% 131
CommunityToolkit.Aspire.Hosting.RavenDB.ApiService 21% 33% 16
CommunityToolkit.Aspire.Hosting.Redis.Extensions 92% 68% 22
CommunityToolkit.Aspire.Hosting.Rust 96% 90% 13
CommunityToolkit.Aspire.Hosting.RustFs 83% 66% 108
CommunityToolkit.Aspire.Hosting.SeaweedFS 88% 80% 49
CommunityToolkit.Aspire.Hosting.Sftp 90% 62% 15
CommunityToolkit.Aspire.Hosting.Sftp.ApiService 94% 100% 10
CommunityToolkit.Aspire.Hosting.Solr 88% 100% 19
CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects 68% 59% 146
CommunityToolkit.Aspire.Hosting.Sqlite 88% 93% 25
CommunityToolkit.Aspire.Hosting.SqlServer.Extensions 86% 79% 48
CommunityToolkit.Aspire.Hosting.Squad 92% 79% 95
CommunityToolkit.Aspire.Hosting.Stripe 50% 17% 119
CommunityToolkit.Aspire.Hosting.SurrealDb 89% 74% 208
CommunityToolkit.Aspire.Hosting.SurrealDb.ApiService 85% 62% 236
CommunityToolkit.Aspire.Hosting.Umami 98% 75% 9
CommunityToolkit.Aspire.Hosting.Zitadel 97% 86% 31
CommunityToolkit.Aspire.KurrentDB 97% 95% 33
CommunityToolkit.Aspire.Logto.Client 53% 62% 38
CommunityToolkit.Aspire.MassTransit.RabbitMQ 100% 100% 24
CommunityToolkit.Aspire.Meilisearch 97% 96% 38
CommunityToolkit.Aspire.Microsoft.Data.Sqlite 94% 85% 26
CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite 71% 73% 117
CommunityToolkit.Aspire.Minio.Client 93% 87% 67
CommunityToolkit.Aspire.OllamaSharp 78% 74% 76
CommunityToolkit.Aspire.RavenDB.Client 96% 73% 87
CommunityToolkit.Aspire.SeaweedFS.Client 95% 86% 93
CommunityToolkit.Aspire.Sftp 94% 94% 54
CommunityToolkit.Aspire.Sqlite.Api 93% 93% 68
CommunityToolkit.Aspire.SurrealDb 87% 73% 40
SeaweedFS.ApiService 100% 100% 15
Summary 76% (12121 / 15917) 62% (3462 / 5551) 6658

return null;
}

static string RenderTable(List<Integration> integrations)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: wouldn't all that be easier with a StringBuilder?

const string TableStart = "<!-- BEGIN AUTOGENERATED INTEGRATIONS TABLE -->";
const string TableEnd = "<!-- END AUTOGENERATED INTEGRATIONS TABLE -->";

bool checkOnly = args.Contains("--check", StringComparer.OrdinalIgnoreCase);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: I would advise check being the default behavior and passing --write to write the new readme

return string.Concat(content.AsSpan(0, tableStart), block, "\n", content.AsSpan(sectionStart));
}

static string CreateDiff(string existing, string updated)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

question: not sure to understand why you need git for.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Documentation review: ensure all integrations are documented and deprecated packages are clearly identified

4 participants