Skip to content

Unify experimental polyglot AppHost feature keys - #20481

Merged
David Pine (IEvangelist) merged 7 commits into
mainfrom
sebros/fix-local-feature-settings
Sep 28, 2026
Merged

David Pine (IEvangelist) merged 7 commits into
mainfrom
sebros/fix-local-feature-settings

Conversation

@sebastienros

@sebastienros Sébastien Ros (sebastienros) commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Description

Project-local aspire config set interpreted the colon in experimental polyglot feature names as a configuration separator, writing an invalid nested features object. Give all four experimental AppHost languages consistent flat feature names so ordinary configuration commands write loadable settings without changes to the configuration service. Update checked-in polyglot fixtures, validation scripts, documentation, and generated VS Code schemas to use the new names. No new dependencies are required.

User-facing usage

Enable the language you need from its AppHost directory:

aspire config set features.experimentalPolyglotJava true
aspire config set features.experimentalPolyglotGo true
aspire config set features.experimentalPolyglotPython true
aspire config set features.experimentalPolyglotRust true

For example, the Java command writes this loadable aspire.config.json:

{
  "features": {
    "experimentalPolyglotJava": "true"
  }
}

The CLI writes "true" as it does for other config set values; the feature reader also accepts JSON true. Focused CLI configuration and language-discovery tests passed (175 tests), a source-built CLI wrote and read all four settings, and all 159 feature-enabled polyglot fixtures and three generated schemas were checked for the new keys.

Breaking changes

Existing project or global feature settings named experimentalPolyglot:java, experimentalPolyglot:go, experimentalPolyglot:python, or experimentalPolyglot:rust no longer enable those languages. Rename each key to experimentalPolyglotJava, experimentalPolyglotGo, experimentalPolyglotPython, or experimentalPolyglotRust, respectively.

Fixes # (issue)

Checklist

  • Is this feature complete?
    • Yes. Ready to ship.
    • No. Follow-up changes expected.
  • Are you including unit tests for the changes and scenario tests if relevant?
    • Yes
    • No
  • Did you add public API?
    • Yes
      • If yes, did you have an API Review for it?
        • Yes
        • No
      • Did you add <remarks /> and <code /> elements on your triple slash comments?
        • Yes
        • No
    • No
  • Does the change make any security assumptions or guarantees?
    • Yes
      • If yes, have you done a threat model and had a security review?
        • Yes
        • No
    • No

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

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/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 20481

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 20481"

@github-actions

This comment has been minimized.

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.

Copilot review overview

🟡 Changes recommended

Feature-prefix comparisons incorrectly remain case-sensitive despite configuration keys being case-insensitive.

Get a fresh assessment by requesting another Copilot review.

Review effort: Balanced
Findings: 1 Medium severity

Open (1)
What changed in this PR

Fixes colon-bearing feature flags in local CLI configuration.

Changes:

  • Preserves colons within feature names during set, list, and delete.
  • Adds regression coverage and usage documentation.
File Description
ConfigurationService.cs Handles colon-bearing feature names.
ConfigCommandTests.cs Tests set/get/delete and reload behavior.
polyglot-apphost.md Documents local Java feature configuration.

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

Comment thread src/Aspire.Cli/Configuration/ConfigurationService.cs Outdated
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@sebastienros Sébastien Ros (sebastienros) changed the title Fix local configuration for colon-named feature flags Unify experimental polyglot AppHost feature keys Sep 25, 2026
@sebastienros Sébastien Ros (sebastienros) added the breaking-change Issue or PR that represents a breaking API or functional change over a prerelease. label Sep 25, 2026
@aspire-repo-bot
aspire-repo-bot Bot requested a balanced review from Copilot September 25, 2026 17:45
@github-actions

This comment has been minimized.

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.

Copilot review overview

🟢 Approval recommended

The rename is consistently applied across implementation, generated schemas, documentation, validation workflows, and all 159 feature-enabled fixtures with focused regression coverage.

Review effort: Balanced
Findings: 1 Medium severity

Open (1)

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@aspire-repo-bot
aspire-repo-bot Bot requested a balanced review from Copilot September 25, 2026 18:03
@sebastienros Sébastien Ros (sebastienros) changed the title Unify experimental polyglot AppHost feature keys Fix project-local config for colon-named feature flags Sep 25, 2026
@sebastienros Sébastien Ros (sebastienros) removed the breaking-change Issue or PR that represents a breaking API or functional change over a prerelease. label Sep 25, 2026

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.

Copilot review overview

🟢 Approval recommended

The implementation matches the documented behavior and includes focused regression coverage across affected operations.

Review effort: Balanced
Findings: 1 Medium severity

Open (1)

@github-actions

This comment has been minimized.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@aspire-repo-bot
aspire-repo-bot Bot requested a balanced review from Copilot September 25, 2026 18:15
@sebastienros Sébastien Ros (sebastienros) changed the title Fix project-local config for colon-named feature flags Unify experimental polyglot AppHost feature keys Sep 25, 2026
@sebastienros Sébastien Ros (sebastienros) added the breaking-change Issue or PR that represents a breaking API or functional change over a prerelease. label Sep 25, 2026
@sebastienros

Copy link
Copy Markdown
Contributor Author

Regarding this selector report: This describes the earlier two-file parser commit and is informational only. No change is needed for this historical test selection.

@sebastienros

Copy link
Copy Markdown
Contributor Author

Regarding this selector report: This records the jobs selected for an earlier flat-key commit and does not request a change. The current PR keeps the flat feature names.

@sebastienros

Copy link
Copy Markdown
Contributor Author

Regarding this selector report: This describes the temporary parser commit, which has been reverted. It is informational only, so no action is needed.

@sebastienros

Copy link
Copy Markdown
Contributor Author

Regarding this selector report: This is an informational snapshot of jobs selected for the earlier flat-key changes. It does not identify a code issue to fix.

@sebastienros

Copy link
Copy Markdown
Contributor Author

Regarding this selector report: This is another historical test-selection snapshot for the flat-key changes. No additional code change is requested.

@sebastienros

Copy link
Copy Markdown
Contributor Author

Regarding this rerun notice: This records an automatic retry of the old CI run, not a new defect. The Java launcher mismatch found afterward has been fixed in commit 930e014.

@sebastienros

Copy link
Copy Markdown
Contributor Author

Regarding this rerun notice: This records the next retry of the old CI run and requires no separate change. The Java launcher flag is corrected in commit 930e014.

@sebastienros

Copy link
Copy Markdown
Contributor Author

Regarding this rerun notice: This records another retry of the old CI run and is informational only. A new CI run is in progress for the corrected Java launcher flag.

@sebastienros

Copy link
Copy Markdown
Contributor Author

Thanks for the detailed testing report. The Java E2E launcher flag was fixed in 930e014 and CI for that head is still running; the Python scaffolding failure has not been shown to be caused by this PR, so we are keeping it out of scope.

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.

Copilot review overview

🟢 Approval recommended

The flat keys are consistently applied across runtime metadata, tests, fixtures, schemas, documentation, and validation paths.

Review effort: Balanced
Findings: None

Resolved since last review (1)

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

Tests selector

4 / 99 PR test projects · 5 PR jobs, from 177 changed files.

Selected PR test projects (4 / 99)

Aspire.Cli.EndToEnd.Tests, Aspire.Cli.Tests, Aspire.Playground.Tests, Infrastructure.Tests

Selected PR jobs (5)

cli-starter-validation, extension-e2e, extension-unit, polyglot, typescript-api-compat


How these were chosen — grouped by what changed

📦 affected project Aspire.Cli
→ 1 test: Aspire.Cli.EndToEnd.Tests

📄 .github/workflows/polyglot-validation/Dockerfile.golang (changed)
→ 1 directly: Infrastructure.Tests

📄 .github/workflows/polyglot-validation/Dockerfile.java (changed)
→ 1 directly: Infrastructure.Tests

📄 .github/workflows/polyglot-validation/Dockerfile.python (changed)
→ 1 directly: Infrastructure.Tests

📄 .github/workflows/polyglot-validation/Dockerfile.rust (changed)
→ 1 directly: Infrastructure.Tests

📄 .github/workflows/polyglot-validation/test-go.sh (changed)
→ 1 directly: Infrastructure.Tests

📄 playground/GoAppHost/apphost.go (changed)
→ 1 directly: Aspire.Playground.Tests

📄 playground/JavaAppHost/aspire.config.json (changed)
→ 1 directly: Aspire.Playground.Tests

📄 playground/JavaSpringBoot/JavaSpringBoot.AppHost.Java/aspire.config.json (changed)
→ 1 directly: Aspire.Playground.Tests

📄 playground/rust/aspire.config.json (changed)
→ 1 directly: Aspire.Playground.Tests

🧪 tests/Aspire.Cli.EndToEnd.Tests/Helpers/CliE2EAutomatorHelpers.cs (changed test)
→ 1 directly: Aspire.Cli.EndToEnd.Tests

🧪 tests/Aspire.Cli.Tests/Commands/ConfigCommandTests.cs (changed test)
→ 1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/Commands/NewCommandTests.cs (changed test)
→ 1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/Projects/DefaultLanguageDiscoveryTests.cs (changed test)
→ 1 directly: Aspire.Cli.Tests

Job reasons

Job Triggered by
cli-starter-validation affected project Aspire.Cli
extension-e2e • extension/schemas/aspire-config.schema.json, extension/schemas/aspire-global-settings.schema.json, extension/schemas/aspire-settings.schema.json, extension/scripts/run-e2e.js, playground/JavaSpringBoot/JavaSpringBoot.AppHost.Java/aspire.config.json, src/Aspire.Cli/KnownFeatures.cs
• affected project Aspire.Cli
extension-unit extension/schemas/aspire-config.schema.json, extension/schemas/aspire-global-settings.schema.json, extension/schemas/aspire-settings.schema.json, extension/scripts/run-e2e.js
polyglot • .github/workflows/polyglot-validation/Dockerfile.golang, .github/workflows/polyglot-validation/Dockerfile.java, .github/workflows/polyglot-validation/Dockerfile.python, .github/workflows/polyglot-validation/Dockerfile.rust, .github/workflows/polyglot-validation/test-go.sh, tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppConfiguration/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppConfiguration/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppConfiguration/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppContainers/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppContainers/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppContainers/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppService/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppService/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppService/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.ApplicationInsights/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.ApplicationInsights/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.ApplicationInsights/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.CognitiveServices/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.CognitiveServices/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.CognitiveServices/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.ContainerRegistry/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.ContainerRegistry/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.ContainerRegistry/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.CosmosDB/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.CosmosDB/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.CosmosDB/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.EventHubs/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.EventHubs/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.EventHubs/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Functions/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Functions/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Functions/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.KeyVault/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.KeyVault/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.KeyVault/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Kusto/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Kusto/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Kusto/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Network/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Network/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Network/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.OperationalInsights/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.OperationalInsights/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.OperationalInsights/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.PostgreSQL/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.PostgreSQL/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.PostgreSQL/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Redis/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Redis/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Redis/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Search/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Search/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Search/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.ServiceBus/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.ServiceBus/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.ServiceBus/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.SignalR/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.SignalR/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.SignalR/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Sql/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Sql/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Sql/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Storage/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Storage/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.Storage/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.WebPubSub/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.WebPubSub/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure.WebPubSub/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Azure/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Blazor/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.DevTunnels/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.DevTunnels/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.DevTunnels/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Docker/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Docker/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Docker/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Dotnet/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Dotnet/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Dotnet/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.EntityFrameworkCore/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.EntityFrameworkCore/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Foundry/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Foundry/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Foundry/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Garnet/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Garnet/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Garnet/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Go/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Go/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Go/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Java/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Java/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Java/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.JavaScript/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.JavaScript/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.JavaScript/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Kafka/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Kafka/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Kafka/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Keycloak/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Keycloak/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Keycloak/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Kubernetes/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Kubernetes/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Kubernetes/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Maui/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Maui/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Maui/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Milvus/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Milvus/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Milvus/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.MongoDB/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.MongoDB/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.MongoDB/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.MySql/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.MySql/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.MySql/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Nats/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Nats/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Nats/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.OpenAI/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.OpenAI/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.OpenAI/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Oracle/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Oracle/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Oracle/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Orleans/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Orleans/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Orleans/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.PostgreSQL/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.PostgreSQL/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.PostgreSQL/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Python/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Python/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Python/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Qdrant/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Qdrant/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Qdrant/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.RabbitMQ/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.RabbitMQ/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.RabbitMQ/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Redis/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Redis/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Redis/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Rust/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Rust/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Rust/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Seq/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Seq/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Seq/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.SqlServer/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.SqlServer/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.SqlServer/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Valkey/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Valkey/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Valkey/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Yarp/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Yarp/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting.Yarp/Python/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting/Go/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting/Java/aspire.config.json, tests/PolyglotAppHosts/Aspire.Hosting/Python/aspire.config.json
• affected project Aspire.Cli
typescript-api-compat affected project Aspire.Cli

Selection computed for commit 638e090.

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.

Copilot review overview

🟢 Approval recommended

The feature keys and all affected consumers, fixtures, schemas, documentation, tests, and validation paths are consistently aligned.

Review effort: Balanced
Findings: None

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@IEvangelist
David Pine (IEvangelist) merged commit 163cf56 into main Sep 28, 2026
376 of 379 checks passed
@microsoft-github-policy-service microsoft-github-policy-service Bot added this to the 14.0 milestone Sep 28, 2026
aspire-repo-bot Bot added a commit to microsoft/aspire.dev that referenced this pull request Sep 28, 2026
Rename experimentalPolyglot:<lang> feature flags to flat experimentalPolyglot<Lang> names to match microsoft/aspire#20481.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@aspire-repo-bot

Copy link
Copy Markdown
Contributor

Pull request created: #1771

Generated by PR Documentation Check · copilot · auto · 55.2 AIC · ⌖ 18.8 AIC · ⊞ 20.3K

@aspire-repo-bot

Copy link
Copy Markdown
Contributor

📝 Documentation has been drafted in microsoft/aspire.dev#1771 targeting release/13.6.

Updated feature-flag docs to match the flat key names introduced in #20481 (triggered signals: pr_label_breaking_change, pr_body_has_user_facing_section, integration_readme_changed, polyglot_code_generator_changed). Renamed features:experimentalPolyglot:go → features.experimentalPolyglotGo in reference/cli/configuration.mdx and integrations/frameworks/go/go-host.mdx, and renamed all four features.experimentalPolyglot:<lang> entries → features.experimentalPolyglot<Lang> in reference/cli/includes/config-settings-table.md. Also removed the now-inaccurate note about a :<language> key suffix in configuration.mdx.

Note

This draft PR needs human review before merging.

David Pine (IEvangelist) added a commit to microsoft/aspire.dev that referenced this pull request Sep 28, 2026
…ps (#1780)

## Summary

<!-- Describe what this pull request changes and why. -->

Reconcile the 13.6 wiki audit and **all 25 open `docs-from-code`
proposals targeting `release/13.6`** against the actual release source.
Add missing canonical guidance rather than putting all coverage in
What's new. This is a new, isolated feature PR into `release/13.6`; it
does not update the release rollup #1599, merge or close another
proposal, or push directly to a release branch.

**Draft with explicit remaining packaging/validation gates:** the six
REPL walkthroughs are source-verified, but current publicly available
13.6 packages do not contain the late `WithRepl` exports. Generated API
catalogs have deliberately not been fabricated or refreshed from 14.x.
See the open checklist below.

### Evidence baseline

- Documentation base: `717442f6666948bcf77f3d704dc2dadf7c080ec2`.
- Product source of truth:
[`microsoft/aspire@e8fd6fbb954f50ccd2e66479538392f65e13e71d`](https://github.com/microsoft/aspire/tree/e8fd6fbb954f50ccd2e66479538392f65e13e71d),
current `release/13.6` at audit time. Source was read from that Git
object, not the stale source working directory.
- [13.6 wiki](https://github.com/microsoft/aspire/wiki/13.6-Change-log)
snapshot `8e01a371d4f16a1306e48174d4cf1fdeca714348`, whose cutoff is
product PR 20511. Later backports 20541/20546/20548 are included here.
- Proposal base branches alone were **not** used as proof of release
membership. Direct ancestry and known release backports were checked.
Four fallback-targeted proposals are excluded below.
- Wiki link corrections: its REPL link #1752 actually covers Sandboxes;
the REPL proposal is #1740. Its AOT link #1714 covers PFX certificates,
not AOT.

### Complete audit-gap checklist

Checked items mean documentation coverage is implemented, not that cloud
deployment or every product runtime scenario was executed.

- [x] **1. Dotnet API graduation:** correct removal to **13.6**, not
14.0, in What's new, both Dotnet guides, and the diagnostic page;
preserve the prerelease package caveat. This applies to core
`AddDotnetProject`, `DotnetProjectResource`, and related
`WithBuildEnvironment` overloads, not all uses of the diagnostic.
Source: microsoft/aspire#20496.
- [x] **2. Sandboxes:** remove obsolete API suppressions in the article
and deployment guide while preserving Azure service preview/access and
prerelease package limitations. Source: microsoft/aspire#20483.
- [x] **3. Docked REPL documentation:** all six
PostgreSQL/MySQL/MongoDB/SQL Server/Redis/Valkey guides plus the article
now cover opt-in `WithRepl`/`withRepl`, run-only availability, actual
client privileges, credential handling, and explicit exit versus closing
a viewer. Source: microsoft/aspire#20419, backport of
microsoft/aspire#20231. Package-backed checks remain open below.
- [x] **4. Terminal CLI flag:** update current 13.6 article,
`with-terminal`, and all three terminal command references. Preserve
`terminals.v1` and experimental hosting API distinctions. Current
configuration/schema data had no flag entry to remove; historical 13.5
notes remain historical. Source: microsoft/aspire#20548.
- [x] **5. First-party Rust:** rewrite both canonical Rust guides around
`Aspire.Hosting.Rust`; document Cargo versus application arguments,
typed targets, debugging, generated Dockerfiles, workspace context, ABI
constraints, and Toolkit migration. Bacon remains explicitly
Toolkit-only. Add exact first-party package mapping. Source:
microsoft/aspire#18906 and current Rust README.
- [x] **6. Agent setup:** align command reference, skills guide,
AI-agent guide, and article on MCP opt-in, `--mcp`,
chained/non-interactive behavior, seven-skill catalog, Project v2
migration, and Copilot app detection. Also fix stale default-selection
text: all applicable bundle skills are preselected; companion tools
remain opt-in. Sources: microsoft/aspire#19893, microsoft/aspire#20405,
microsoft/aspire#19820.
- [x] **7. Deno AppHost runtime:** document Deno 2+ detection, commands,
permissions, native watch/type checking, doctor, and `DENO_CERT`,
separately from Deno guest hosting. Source: microsoft/aspire#18627,
distinct from microsoft/aspire#18628.
- [x] **8. Native AOT / Fluent UI v5:** concise article, dashboard
exploration, and standalone guidance; automatic packaged-dashboard
selection, no invented performance figures. Source:
microsoft/aspire#19565 and release packaging sources.
- [x] **9. NuGet:** document bundled in-process operations, credential
providers, non-interactive authentication, and realistic
troubleshooting. Correct the proposal's `dotnet nuget locals`
authentication advice: cache commands do not authenticate a feed.
Source: microsoft/aspire#20391.
- [x] **10. Multithreaded builds:** article and coordinated-build guide
explain `-mt`, SDK detection, distinct project/file-based SDK floors,
and fallback. Source: microsoft/aspire#20441.
- [x] **11. Radius:** add a real deployment guide with C#/TypeScript
setup, recipe-backed connections versus local endpoints, per-resource
credential behavior, unauthenticated Redis limitation, secret exposure
boundaries, and actionable runtime diagnostics 070–091. Wire navigation
and exact package mapping. Source: microsoft/aspire#19555 and release
README.
- [x] **12. Connection aliases:** replace contradictory no-encoding
guidance, retain composed logical-key-first lookup and portable-target
behavior, explain collision detection and custom-publisher metadata.
Source: microsoft/aspire#19729.
- [x] **13. Connector Namespace / Toolbox / provisioning:** add
Connector Namespace walkthrough, security/consent/revocation limits and
mapping/sidebar; add Foundry Toolbox walkthrough, connection properties,
roles, index prerequisites, approval enforcement boundaries, immutable
versions, and existing-resource behavior. Extend existing Azure
provisioning guide without a duplicate page. Sources:
microsoft/aspire#19024, microsoft/aspire#17742, microsoft/aspire#20131.
- [x] **14. Remaining high-impact items:** article covers opt-in
manifest-aware DNX and new-template CLI bundling (existing SDK guides
retained), migration skill and Copilot app detection; canonical inline
`CsiVolumeSourceV1`/`VolumeV1.Csi` example, management links, Cosmos
vNext telemetry, and AI Inference `GetModelInfoAsync`/`/info` health
checks with `DisableHealthChecks`. No Azure OpenAI health-check claim.
Sources: microsoft/aspire#19310, microsoft/aspire#19076,
microsoft/aspire#19826, microsoft/aspire#20070, microsoft/aspire#15671,
microsoft/aspire#15969.
- [x] **15. All 25 proposal dispositions:** listed below, including
newer dashboard backports and four exclusions. Existing Sandbox
inference coverage is retained rather than copied from a stale draft.
- [ ] **16. Refresh generated API/catalog/Twoslash data from an official
post-backport 13.6 build.** Existing `26473.12`/`a11eca96` data remains
untouched. The newest public `dotnet9` feed package checked,
`13.6.0-preview.1.26474.10` at
`43496a2a306c81c862c947b11b4f4e5494b6fe08`, still has no Redis
`WithRepl` in its actual package XML. Do not use 14.x, hand-edit
declarations, or attribute source changes to older binaries.
- [ ] **Validate the six REPL examples against that actual post-backport
SDK and running clients.** Their new TypeScript fences are plain
TypeScript, not annotated with unsupported Twoslash data. No existing
diagnostics are allowlisted or suppressed; no generated API exports are
fabricated. Enable Twoslash when the genuine catalog catches up.

### All 25 open proposal dispositions and provenance

Text is selectively adapted from these proposals, not merged wholesale.
#1778 and #1748 are authored by @sebastienros; the other proposals are
authored by the Aspire repo bot. The table credits the associated
product-change authors where supplied by the proposals. Existing PRs
remain open and unchanged.

| Docs PR | Release source / credited product author | Disposition |
| --- | --- | --- |
| #1778 | microsoft/aspire#19729 — @sebastienros | **Adopted:**
canonical connection-string alias correction, including logical-first
resolution and migration. |
| #1771 | microsoft/aspire#20481 — @sebastienros | **Excluded:** flat
polyglot feature keys are not in the audited release tip; no verified
backport. Preserve release key names. |
| #1770 | microsoft/aspire#20525 → microsoft/aspire#20548 — @mitchdenny
| **Corrected/adopted:** command guides plus the still-current 13.6
article, which the proposal incorrectly treats as historical. |
| #1769 | microsoft/aspire#20416 — @JamesNK | **Excluded:** brand hover
change has no verified 13.6 membership/backport. |
| #1768 | microsoft/aspire#20523 → microsoft/aspire#20546 — @JamesNK |
**Adopted:** run pin/unpin preserves selector and current selection. |
| #1766 | microsoft/aspire#20537 → microsoft/aspire#20541 — @mitchdenny
| **Adopted:** terminal dock empty state. |
| #1761 | microsoft/aspire#20490 → microsoft/aspire#20496 — @eerhardt |
**Corrected:** graduation is 13.6, package remains prerelease,
Blazor-specific exception retained. |
| #1760 | microsoft/aspire#20436 — @eerhardt | **Excluded:** CLI
net11/tools-any retarget is not in the audited release; no fallback-base
inference. |
| #1748 | microsoft/aspire#20131 — @sebastienros | **Adopted:** extend
existing provisioning guide with service-specific models/lookups and
projection limits. |
| #1744 | microsoft/aspire#20337 → microsoft/aspire#20441 — @karolz-ms |
**Adopted:** precise SDK-conditional multithreaded build coverage. |
| #1740 | microsoft/aspire#20231 → microsoft/aspire#20419 — @mitchdenny
| **Adapted:** all six guides; TypeScript-first tabs, source-verified
lifecycle/security. Actual post-backport SDK/runtime gate is open above.
|
| #1738 | microsoft/aspire#20158 → microsoft/aspire#20405 — @karolz-ms |
**Partly already covered / completed:** existing seven-skill catalog
retained; add project migration guidance and correct command
catalog/defaults. Do not misclassify the bundled skill as a companion
tool. |
| #1735 | microsoft/aspire#20334 — @karolz-ms | **Excluded:** enhanced
startup errors are not in the audited release; no verified backport. |
| #1731 | microsoft/aspire#19847 → microsoft/aspire#20391 — @eerhardt |
**Corrected/adopted:** in-process NuGet and real authenticated-restore
troubleshooting, not cache-command authentication. |
| #1719 | microsoft/aspire#20299 → microsoft/aspire#20407 — @JamesNK |
**Corrected/adopted:** cookie naming/scoping; identical names can
collide but do not guarantee cross-dashboard cookie decryptability or
shared sign-in. |
| #1664 | microsoft/aspire#20011 — @maddymontaquila | **Adopted:**
concise Azure environment icon release note. |
| #1628 | microsoft/aspire#17742 — @davidfowl | **Adapted/expanded:**
canonical Toolbox examples, consumer contract, role/index prerequisites,
approval/security and concurrency limits. |
| #1623 | microsoft/aspire#19810 — @mitchdenny | **Already covered:**
current Sandbox guide/article already describe compute inference,
explicit selection and external endpoints. Preserve that guidance while
removing obsolete suppressions. |
| #1620 | microsoft/aspire#19243 — @sebastienros | **Adapted:** AKS
credential-before-Helm cleanup and destructive-operation warning; omit
misleading ambient-context workaround. |
| #1614 | microsoft/aspire#19870 — @sebastienros | **Adopted:** typed
callback handle behavior in extension authoring and article. |
| #1574 | microsoft/aspire#19430 — @mitchdenny | **Adapted:** canonical
hostname inheritance, explicit-host precedence, catch-all default
backend. |
| #1570 | microsoft/aspire#19590 — @karolz-ms | **Adopted:** Dev Tunnel
URL regression troubleshooting. |
| #1565 | microsoft/aspire#19429 — @mitchdenny | **Corrected/adopted:**
Helm embedded parameters with real `refExpr` and `addParameter(name, {
value })`, not stringifying a handle or using an invalid actual-SDK
overload. |
| #1564 | microsoft/aspire#19026 — @karolz-ms | **Corrected/adopted:**
C#/TypeScript Dotnet gateway walkthrough. Retain both experimental
diagnostics; remove obsolete run-only restriction after
microsoft/aspire#19997 publishing support. Avoid imported ambiguous API
reference. |
| #1499 | microsoft/aspire#19248 — @IEvangelist | **Adopted:** describe
exact secret-value redaction and embedded-secret limit; release article
already covered the fix. |

### Important source-verified corrections to proposals / earlier audit
assumptions

-
[`BlazorGatewayExtensions.cs`](https://github.com/microsoft/aspire/blob/e8fd6fbb954f50ccd2e66479538392f65e13e71d/src/Aspire.Hosting.Blazor/BlazorGatewayExtensions.cs):
`AddDotnetProjectBlazorGateway` and the Dotnet `WithBlazorClientApp`
overload still carry `ASPIREDOTNETPROJECT001`; the class carries
`ASPIREBLAZOR001`. They share `WithBlazorClientAppCore`/`WithBlazorApp`
and the publish-companion path. Thus neither blanket diagnostic
retirement nor the proposal's old run-only claim is correct.
-
[`SkillDefinition.cs`](https://github.com/microsoft/aspire/blob/e8fd6fbb954f50ccd2e66479538392f65e13e71d/src/Aspire.Cli/Agents/SkillDefinition.cs)
sets bundled skills' `IsDefault=true`;
[`AgentInitCommand.cs`](https://github.com/microsoft/aspire/blob/e8fd6fbb954f50ccd2e66479538392f65e13e71d/src/Aspire.Cli/Commands/AgentInitCommand.cs)
selects the applicable catalog defaults for both flows. MCP has its own
standalone-only binding.
-
[`TypeScriptAppHostToolchainResolver.cs`](https://github.com/microsoft/aspire/blob/e8fd6fbb954f50ccd2e66479538392f65e13e71d/src/Aspire.Cli/Projects/TypeScriptAppHostToolchainResolver.cs)
is the source for Deno flags and certificate variable; guest Deno
hosting is separate.
- [`Radius
README`](https://github.com/microsoft/aspire/blob/e8fd6fbb954f50ccd2e66479538392f65e13e71d/src/Aspire.Hosting.Radius/README.md)
supplies the resource-specific credential rules and publish diagnostics,
not assumptions about local endpoints.

## Third-party links and affiliations

<!-- List third-party links and disclose material affiliations. -->

Links point to official Microsoft Learn, VS Code Marketplace debugger
extensions, Rust/Cargo/Bacon documentation, Radius documentation, and
source repositories. No sponsorship, commercial endorsement, or
affiliation claim is introduced. Maintainers should supply any personal
affiliation disclosure required by policy; automation has not inferred
one.

## Validation

<!-- List the checks you ran or explain why validation isn't needed. -->

- **97 passing focused unit checks** across API-reference
authoring/rendering, Twoslash blocks, file-tree formatting, CLI
configuration schema, SEO lengths, and resource catalog.
- **82 passing structured-data checks**, including exact integration
mapping uniqueness and page resolution.
- **11 C# samples compile**, zero warnings/errors, using genuine
`13.6.0-preview.1.26473.12` packages. Scope: Rust, Connector Namespace,
Radius, Toolbox, inline CSI, Helm, Blazor gateway, and provisioning.
`Projects.Api/Worker/Client` use compile-only `IProjectMetadata`
stand-ins; no claim of running those apps or provisioning cloud
resources.
- **10 TypeScript samples pass `tsc`** under `strict`, `NodeNext`, and
`ES2022` against three **unmodified actual SDK files**, not just the
site's declaration bundle. The fixture uses the exact `e8fd6fbb` release
`AtsCapabilityScanner` and genuine `26473.12`
TypeSystem/code-generator/integration binaries, whose informational
source is `a11eca96`. This is an isolated local generation fixture,
**not** a claim that official CLI generation or a new packaged release
was tested. An attempted restore with the older handed-off local CLI
could not discover an AppHost server; the bounded direct generator
fixture was used instead.
- The SDK scan is **not globally warning-free**: it reports a Radius
`withContainerImage` collision on `CSharpAppResource` and an App
Configuration `createRoleAssignment` overload collision. None of the
compiled examples calls those colliding methods; the warnings are
retained in evidence, not suppressed, and no generated declarations were
edited.
- Browser: Connector Namespace, Radius, both Rust pages, Foundry
hosting, and What's new return **HTTP 200**, correct headings, and no
rendered Twoslash errors. New guide/article page-local anchors and the
cross-page Blazor anchor resolve. Connector/Radius mobile layouts have
no horizontal overflow; Connector language-tab interaction works.
Standalone Astro preview emits expected `/api/live` 404s because
StaticHost is not running.
- `git diff --check` passes. No production `pnpm build`, cloud
deployment, REPL runtime session, full product suite, or blanket
validation of every pre-existing example was performed.
- Generated C#/TypeScript API data, declaration bundles, integration
catalogs, image catalogs, and contributor data are unchanged. Only the
authored package-to-guide mapping is updated.

**Before merging:** complete the two packaging/REPL checkboxes above,
inspect CI, and obtain human review. This PR intentionally does not
close or merge the source documentation proposals.

---------

Co-authored-by: David Pine <7679720+IEvangelist@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
David Pine (IEvangelist) added a commit to microsoft/aspire.dev that referenced this pull request Oct 5, 2026
)

## Summary

<!-- Describe what this pull request changes and why. -->

The `aspire.config.json` schema on aspire.dev stopped at 13.3.0, so
`/reference/cli/configuration/schema.json` served an outdated schema.
The CLI configuration docs had also drifted from the 13.6.0 CLI. This PR
syncs the schema for every stable microsoft/aspire release through
13.6.0, keeps it in sync automatically, and corrects the config docs.

### Schemas

- Adds the schema for every stable release from 13.2.0 through 13.6.0:
22 new files, 24 versions in total. `latest` now points to 13.6.0
instead of 13.3.0.
- Each file is generated from that release's own CLI. The sync installs
the `Aspire.Cli` tool at the release version, reads `aspire config info
--json`, and converts the output the same way upstream's
`extension/scripts/generate-schema.js` does. `$id` is set to the file's
aspire.dev URL.
- Upstream's checked-in `extension/schemas/aspire-config.schema.json` is
stale at the 13.3.x and 13.4.x tags. Starting with 13.3.0, the CLI emits
camelCase JSON. The generator at those tags still read PascalCase, so it
exited without writing anything, and the checked-in file kept the 13.2
content. 13.5.0 fixed the generator.
- For 13.2.x, 13.5.x, and 13.6.0, the generated files are identical to
upstream's checked-in file at each tag, apart from `$id`.
- For 13.3.x and 13.4.x, the generated files follow what those CLIs
actually accept. This also corrects the existing 13.3.0 file, which was
a copy of the stale upstream file. That's the only change to a schema
published before this PR, and it's there because the file didn't match
the 13.3.0 CLI.
- Schema changes by release:
- 13.3.0 adds `docs.llmsTxtUrl`, `docs.api.sitemapUrl`, and
`features.nugetSignatureVerificationEnabled`.
- 13.4.0 adds `features.aspireSkillsRemoteFetchEnabled` and removes
`features.execCommandEnabled`.
- 13.5.0 adds `features.polyglotIntegrationFilterEnabled` and
`features.terminalCommandsEnabled`, and hides
`features.aspireSkillsRemoteFetchEnabled`.
- 13.6.0 adds `certificates.nssDbPaths` and removes
`features.terminalCommandsEnabled`.

### Automation

- `scripts/update-schemas.ts` now lists microsoft/aspire releases and
generates the schema for each stable release from 13.2.0 on, including
the `v13.4.4-release` tag form. For each missing version, it installs
that `Aspire.Cli` version into a temporary directory with `dotnet tool
install`, runs `aspire config info --json`, and generates the schema
from the output. It skips versions it already has, keeps `index.json`
sorted with `latest` set to the newest version, and fails when a release
can't be installed or read. `--version <version>` generates a single
version. The script now requires the .NET SDK, which the updater
workflow already installs.
- `pnpm update:all` now ends with `pnpm update:schemas`, so the daily
Integration Data Updater workflow picks up new releases. The workflow's
`git add` list and the updater script's allowed paths and PR body now
include `src/frontend/src/data/schemas/`.
- A release's schema never changes after it ships. The sync script never
re-fetches or overwrites an existing versioned schema, and the updater's
scope check fails if a run modifies, deletes, or renames one. New schema
files and `index.json` updates are still allowed.

### Tests

- `cli-config-schema.vitest.test.ts` checks that `index.json` versions
are unique and sorted, that `latest` is the newest version, and that
every schema file is indexed. The structured-data suite now includes
this file, so the updater validates schema changes before it opens a PR.
- `update-integrations.vitest.test.ts` checks the schema sync wiring in
`update:all`, the structured-data config, the updater's allowed paths,
the workflow's `git add` list, the updater's rejection of changes to
published schemas, and that the schema sync generates from the released
CLI.

### Docs

- The settings table, shared by the configuration, `aspire config`, and
`aspire config set` pages:
- Merges the two identical key columns into one and adds a default value
column.
- Adds the missing settings: `appHost.language`, `docs.api.sitemapUrl`,
`docs.llmsTxtUrl`, `features.nugetSignatureVerificationEnabled`,
`features.stagingChannelEnabled`, `packages.<packageId>`,
`profiles.<name>.applicationUrl`,
`profiles.<name>.environmentVariables`, and `sdk.version`.
- Updates the `appHost.path`, `channel`,
`features.polyglotIntegrationFilterEnabled`, and `overrideStagingFeed`
descriptions to match the 13.6.0 CLI.
- Explains how dotted keys map to nested JSON, and adds a caution about
the `aspire config set` limitation described under Known CLI issues.
- The configuration page:
- Uses `%ASPIRE_VERSION%` for the versioned schema URL instead of a
hard-coded 13.2.3, and states that every stable release starting with
13.2.0 has a versioned schema that never changes after the release
ships.
- Corrects the schema dialect to draft-07. The page said Draft 2020-12.
- Writes the Go example key as `features.experimentalPolyglot:go` to
match the table, and explains why these flags need `--global`.
- Moves the tip about `aspire config list --all` into the feature flags
section, and updates the description and intro to mention default
values.

### Known CLI issues

The docs now describe these 13.6.0 CLI behaviors as limitations. They
need fixes in microsoft/aspire:

- `aspire config set` treats every `.` and `:` in a key as a nesting
separator. Without `--global`, `aspire config set
features.experimentalPolyglot:go true` writes a nested
`experimentalPolyglot` object to the local `aspire.config.json` file,
and later commands fail to load the file. Dotted package IDs such as
`Aspire.Hosting.Redis` also become nested objects.
- The CLI reads `overrideStagingFeed`, but the published schema doesn't
define it and sets `additionalProperties: false`, so schema-aware
editors flag it as an unknown property.

### Polyglot feature keys

The 13.6.0 docs and schema keep the `experimentalPolyglot:<language>`
keys because that's what 13.6.0 ships: `KnownFeatures.cs` and
`extension/schemas/aspire-config.schema.json` at `v13.6.0` and on
`release/13.6` both use the colon form. microsoft/aspire#20481, a
breaking change merged to `main` after the 13.6.0 branch was cut,
renames them to `experimentalPolyglotJava`, `experimentalPolyglotGo`,
`experimentalPolyglotPython`, and `experimentalPolyglotRust`. The schema
sync adds the renamed keys with the first release that ships them. The
docs table needs a follow-up update at that point.

## Third-party links and affiliations

<!--
List any third-party links added or changed by this pull request and
disclose any
material affiliation with the linked organizations, such as employment,
sponsorship, or ownership. Write "None" if this pull request doesn't add
or
change third-party links.
-->

None. The new schema files carry upstream's standard `$schema`
meta-schema URI, `http://json-schema.org/draft-07/schema#`, which the
existing schema files already use.

## Validation

<!-- List the checks you ran or explain why validation isn't needed. -->

Run from `src/frontend` on the final commit unless noted:

- `pnpm lint`: passed.
- `pnpm test:unit`: passed. 77 files, with 986 tests passed and 1
skipped.
- `pnpm test:unit:structured-data`: passed. 5 files, with 99 tests
passed.
- Targeted `vitest` run of `update-integrations.vitest.test.ts` and
`cli-config-schema.vitest.test.ts`: passed. 2 files, with 59 tests
passed.
- Ran the updater's scope check in a clean worktree. It passed on a
clean tree, with a new schema file plus an `index.json` edit, and with a
staged new schema. It failed with the new error when an existing schema
was modified or deleted.
- `pnpm test:e2e tests/e2e/schema-routes.spec.ts`: passed. 75 tests
across the desktop, tablet, and mobile projects.
- `pnpm update:schemas`, with all schema files removed: regenerated all
24 versions from the released CLIs. A second run generated nothing.
- `.github/scripts/check-forbidden-words.sh <merge-base> HEAD`, run from
the repository root: no forbidden phrases in added lines.
- Installed all 24 released CLIs and compared each schema with that
CLI's `aspire config info --json` output. Also ran each tag's own
`generate-schema.js` against that output. For 13.2.x and 13.5.0 on, it
reproduces the checked-in file. For 13.3.x and 13.4.x, it fails on the
camelCase output and exits 0.
- Checked the feature and property names in each tag's
`KnownFeatures.cs` and `AspireConfigFile.cs` against the matching
schema.
- `astro dev`: the configuration, `aspire config`, and `aspire config
set` pages render the new table and caution, `%ASPIRE_VERSION%` resolves
to 13.6.0, and each versioned schema route serves the matching schema.
- Checked the documented behavior against the `v13.6.0` source and an
isolated install of the 13.6.0 Aspire CLI, including `aspire config set`
key handling, `aspire add` writing to `packages`, and the `docs` URL
defaults.

Not run locally: `pnpm build:production` and the full Playwright suite.
CI runs both.

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-cli breaking-change Issue or PR that represents a breaking API or functional change over a prerelease.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants