[release/13.3] Consolidate Helm chart options on WithHelm(...) (#16759) - #16802
Conversation
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 16802Or
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 16802" |
There was a problem hiding this comment.
Pull request overview
Backport to release/13.3 that consolidates Helm chart metadata configuration (name/version/description) onto WithHelm(...) for KubernetesEnvironmentResource, and updates Kubernetes publishing output to use Helm’s {{ .Chart.Name }} template variable for the app.kubernetes.io/name label. It also removes a deploy-time Chart.yaml rewrite and expands tests/snapshots accordingly.
Changes:
- Add
WithChartName(...)/WithChartDescription(...)APIs onHelmChartOptions(including parameter-backed overloads) and new annotations to carry these values. - Resolve Helm chart metadata annotations during publish so
Chart.yamlis written correctly on the first pass (includingappVersion). - Switch emitted Kubernetes resource labels to
{{ .Chart.Name }}and update polyglot AppHosts + Verify snapshots.
Reviewed changes
Copilot reviewed 72 out of 72 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/PolyglotAppHosts/Aspire.Hosting.Kubernetes/TypeScript/apphost.ts | Uses new helm.withChartName/withChartDescription APIs; removes direct env Helm-chart property access. |
| tests/PolyglotAppHosts/Aspire.Hosting.Kubernetes/Python/apphost.py | Uses new with_chart_name/with_chart_description Helm options; removes direct env Helm-chart property access. |
| tests/PolyglotAppHosts/Aspire.Hosting.Kubernetes/Java/AppHost.java | Uses new withChartName/withChartDescription Helm options; removes direct env Helm-chart property access. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ResourceWithProbes#02.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ResourceWithProbes#01.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ResourceWithProbes#00.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_HandlesSpecialResourceName#06.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_HandlesSpecialResourceName#05.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_HandlesSpecialResourceName#04.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_HandlesSpecialResourceName#03.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_HandlesSpecialResourceName#02.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_HandlesConditionalReferenceExpressionWithParameterCondition#05.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_HandlesConditionalReferenceExpressionWithParameterCondition#04.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_HandlesConditionalReferenceExpressionWithParameterCondition#03.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_HandlesConditionalReferenceExpressionWithParameterCondition#02.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_HandlesConditionalReferenceExpression#05.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_HandlesConditionalReferenceExpression#04.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_HandlesConditionalReferenceExpression#03.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_HandlesConditionalReferenceExpression#02.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_GeneratesValidHelmChart#09.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_GeneratesValidHelmChart#08.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_GeneratesValidHelmChart#07.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_GeneratesValidHelmChart#06.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_GeneratesValidHelmChart#05.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_GeneratesValidHelmChart#04.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_GeneratesValidHelmChart#03.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_GeneratesValidHelmChart#02.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_CustomWorkloadAndResourceType#07.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_CustomWorkloadAndResourceType#06.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_CustomWorkloadAndResourceType#05.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_CustomWorkloadAndResourceType#04.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_CustomWorkloadAndResourceType#03.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_CustomWorkloadAndResourceType#02.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ConditionalWithParameterBranch_UsesIfElseSyntax#05.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ConditionalWithParameterBranch_UsesIfElseSyntax#04.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ConditionalWithParameterBranch_UsesIfElseSyntax#03.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ConditionalWithParameterBranch_UsesIfElseSyntax#02.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAppliesServiceCustomizations.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }}. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesWithProjectResources#08.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesWithProjectResources#07.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesWithProjectResources#06.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesWithProjectResources#05.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesWithProjectResources#04.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesWithProjectResources#03.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesWithProjectResources#02.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesMapsPortsForBaitAndSwitchResources#08.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesMapsPortsForBaitAndSwitchResources#07.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesMapsPortsForBaitAndSwitchResources#06.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesMapsPortsForBaitAndSwitchResources#05.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesMapsPortsForBaitAndSwitchResources#04.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesMapsPortsForBaitAndSwitchResources#03.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesMapsPortsForBaitAndSwitchResources#02.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.PublishingKubernetesEnvironmentPublishesFile#02.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }}. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env2/templates/ServiceB/service.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }}. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env2/templates/ServiceB/deployment.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }}. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env2/templates/ServiceB/config.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env2/templates/env2-dashboard/service.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env2/templates/env2-dashboard/deployment.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }}. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env1/templates/ServiceA/service.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }}. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env1/templates/ServiceA/deployment.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }}. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env1/templates/ServiceA/config.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }} and normalizes file header. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env1/templates/env1-dashboard/service.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }}. |
| tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env1/templates/env1-dashboard/deployment.verified.yaml | Updates expected app.kubernetes.io/name label to {{ .Chart.Name }}. |
| tests/Aspire.Hosting.Kubernetes.Tests/KubernetesPublisherTests.cs | Updates test to configure chart name via WithHelm instead of WithProperties. |
| tests/Aspire.Hosting.Kubernetes.Tests/KubernetesDeployTests.cs | Adds coverage for new chart metadata APIs, publish-time resolution, and label templating; updates chart-version validation expectations. |
| src/Aspire.Hosting.Kubernetes/KubernetesResource.cs | Emits app.kubernetes.io/name using the Helm template variable .Chart.Name. |
| src/Aspire.Hosting.Kubernetes/KubernetesPublishingContext.cs | Resolves chart name/version/description annotations during publish before writing Chart.yaml. |
| src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentResource.cs | Internalizes chart metadata properties and wires publish step dependency on PublishPrereq. |
| src/Aspire.Hosting.Kubernetes/HelmChartOptions.cs | Adds WithChartName/WithChartDescription, validation helpers, and broadens chart-version validation to Helm-compatible styles. |
| src/Aspire.Hosting.Kubernetes/Deployment/HelmDeploymentEngine.cs | Removes deploy-time Chart.yaml rewrite logic for chart version. |
| src/Aspire.Hosting.Kubernetes/Annotations/HelmChartNameAnnotation.cs | Adds annotation type to carry chart name as a ReferenceExpression. |
| src/Aspire.Hosting.Kubernetes/Annotations/HelmChartDescriptionAnnotation.cs | Adds annotation type to carry chart description as a ReferenceExpression. |
| var name = await nameAnnotation.Name.GetValueAsync(cancellationToken).ConfigureAwait(false); | ||
| if (!string.IsNullOrWhiteSpace(name)) | ||
| { | ||
| HelmChartOptions.ValidateChartName(name, nameof(HelmChartOptions.WithChartName)); | ||
| environment.HelmChartName = name; |
| var version = await versionAnnotation.Version.GetValueAsync(cancellationToken).ConfigureAwait(false); | ||
| if (!string.IsNullOrWhiteSpace(version)) | ||
| { | ||
| HelmChartOptions.ValidateChartVersion(version, nameof(HelmChartOptions.WithChartVersion)); |
| var description = await descriptionAnnotation.Description.GetValueAsync(cancellationToken).ConfigureAwait(false); | ||
| if (!string.IsNullOrWhiteSpace(description)) | ||
| { | ||
| HelmChartOptions.ValidateChartDescription(description, nameof(HelmChartOptions.WithChartDescription)); |
|
Re-running the failed jobs in the CI workflow for this pull request because 3 jobs were identified as retry-safe transient failures in the CI run attempt.
Matched test failure patterns (2 tests)
|
|
/deployment-tests |
|
🎬 CLI E2E Test Recordings — 68 recordings uploaded (commit View all recordings
📹 Recordings uploaded automatically from CI run #25405538370 |
|
/deployment-test |
|
🚀 Deployment tests starting on PR #16802... This will deploy to real Azure infrastructure. Results will be posted here when complete. |
|
❌ Deployment E2E Tests failed — 20 passed, 13 failed, 0 cancelled View test results and recordings
|
160e5ac
into
release/13.3
Replace deprecated WithProperties(k8s => k8s.HelmChartName = ...) examples with the consolidated WithHelm(helm => helm.WithChartName(...)) API introduced in microsoft/aspire#16759 / microsoft/aspire#16802. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Pull request created: #858
|
|
📄 Documentation updates have been drafted for this PR. A draft PR has been opened on microsoft/aspire.dev targeting What was changed:
The draft PR needs human review before merging.
|
Replace deprecated WithProperties(k8s => k8s.HelmChartName = ...) examples with the consolidated WithHelm(helm => helm.WithChartName(...)) API introduced in microsoft/aspire#16759 / microsoft/aspire#16802. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace deprecated WithProperties(k8s => k8s.HelmChartName = ...) examples with the consolidated WithHelm(helm => helm.WithChartName(...)) API introduced in microsoft/aspire#16759 / microsoft/aspire#16802. Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add docs for Azure Network Security Perimeter (NSP) support (#698)
Add documentation for the new NSP APIs introduced in microsoft/aspire#15711.
The new section on the Azure Virtual Network page covers:
- What NSPs are and why they're useful for PaaS service isolation
- AddNetworkSecurityPerimeter() API
- WithAccessRule() for inbound/outbound access rules
- WithNetworkSecurityPerimeter() for associating PaaS resources
- Enforced vs. Learning access modes
- List of supported Azure resources
Also adds a shell What's new in Aspire 13.3 page with an NSP highlight
and a sidebar entry.
Fixes #689
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [docs] Add --include-hidden option docs to describe, logs, and export commands (#723)
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: James Newton-King <james@newtonking.com>
* Add aspire docs api command reference pages (#715)
Documents the new aspire docs api list|search|get sub-commands
introduced in microsoft/aspire#15814.
- Add aspire-docs-api.mdx (group command overview)
- Add aspire-docs-api-list.mdx
- Add aspire-docs-api-search.mdx
- Add aspire-docs-api-get.mdx
- Update aspire-docs.mdx to include the api sub-command in the table
- Update sidebar reference.topics.ts with the new entries
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Document Azure:CredentialProcessTimeoutSeconds option (#731)
* Document Azure:CredentialProcessTimeoutSeconds option
Adds documentation for the new Azure:CredentialProcessTimeoutSeconds configuration option introduced in microsoft/aspire#16175. The option lets users override the credential subprocess timeout (range 5-600) when az login validation is slow due to antivirus, network latency, etc.
- Adds the option to the Local Azure provisioning configuration table and a new 'Credential process timeout' section.
- Adds a 'Configurable Azure credential timeout' section to the What's new in Aspire 13.3 doc.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Mention CredentialProcessTimeoutSeconds in deployment env var asides
Adds a follow-up note to each `Azure__SubscriptionId` env var list pointing at the new credential process timeout option for users hitting slow credential validation.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update dashboard API defaults and otel command docs (#732)
- Dashboard:Api:Enabled now defaults to true (API enabled by default)
- Dashboard:Api:AuthMode now defaults to ApiKey
- Add Dashboard:Api:Disabled as the new preferred config to disable the API
- Mark Dashboard:Api:Enabled as deprecated in docs
- Update PrimaryApiKey default to note auto-generation
- Add --dashboard-url and --api-key options to aspire otel logs/spans/traces
- Document login URL support: passing http://host/login?t=<token> auto-exchanges the token for an API key
- Update aspire otel main page description to mention standalone dashboard usage
Documents changes from microsoft/aspire#16326
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add docs for Azure Front Door integration (#730)
* Add docs for Azure Front Door integration
Adds a new integration page for Azure Front Door, adds it to the sidebar, and adds a section to the What's new in Aspire 13.3 doc.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <david.pine@microsoft.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Rewrite Kubernetes docs for Aspire 13.3 (#734)
- Add deployment/kubernetes/ folder with overview, vanilla K8s, and AKS pages
- Add aspire deploy support for vanilla Kubernetes (helm install via kubectl context)
- Add Aspire.Hosting.Azure.Kubernetes (AKS) deployment docs with full provisioning
- Add container registry configuration (AddContainerRegistry + WithContainerRegistry)
- Add AKS integration page (integrations/cloud/azure/aks/)
- Update K8s integration page with TypeScript tabs and deploy support
- Update sidebar, deployment overview table, deployment index cards
- Add integration-docs.json mapping for Aspire.Hosting.Azure.Kubernetes
- All code examples include both C# and TypeScript tabs
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [docs] Support alternative TypeScript AppHost toolchains (Bun, Yarn, pnpm) (#746)
* docs: document alternative TypeScript AppHost toolchains (Bun, Yarn, pnpm)
- Add toolchain detection and declaration section to typescript-apphost.mdx
- Update prerequisites.mdx to list all supported package managers
- Update aspire-doctor.mdx to mention JavaScript toolchain environment check
Documents changes from microsoft/aspire#16162.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Apply suggestions from code review
Co-authored-by: David Pine <david.pine@microsoft.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/frontend/src/content/docs/get-started/prerequisites.mdx
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <david.pine@microsoft.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Fix CLI overview links in standalone dashboard docs
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Mark aspire dashboard commands as preview (#773)
* chore: update release notes to Aspire 13.3 across multiple language documentation
Co-authored-by: Copilot <copilot@github.com>
* [docs] Add private endpoint support for Azure Container Registry (#770)
* docs: add private endpoint support for Azure Container Registry
Document the new private endpoint support for AzureContainerRegistryResource
added in microsoft/aspire#16132. Covers:
- Automatic SKU upgrade to Premium when a private endpoint is added
- Deployment warning about public network access being disabled
- New 'Use private endpoints' section on the ACR hosting integration page
- Service-specific note for ACR in the Virtual Network integration docs
- What's-new entry in aspire-13-3.mdx
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* PR feedback
---------
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
* docs: add [AspireValue] exported value catalogs to multi-language integration guide (#757)
Documents the new [AspireValue] attribute introduced in microsoft/aspire#16287
(milestone 13.3). Covers:
- How to annotate static fields/properties with [AspireValue] to export
predefined value catalogs into guest SDKs (TypeScript, Python, Java, etc.)
- Nested static class hierarchy mapping to nested catalog namespaces
- Using catalog values in TypeScript and Python AppHosts
- Overriding exported names with the Name property
- Value catalog constraints (static, JSON-serializable, no handles)
- Updated ASPIREATS001 diagnostics page to list [AspireValue] as protected
- Updated supported types table to include exported values row
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add Kubernetes Ingress and Gateway API documentation (#781)
* Add Kubernetes Ingress and Gateway API documentation
New pages:
- kubernetes-ingress.mdx: Overview with Ingress vs Gateway API decision
matrix, TLS overview, and parameter usage
- kubernetes-ingress-aks.mdx: Walkthrough for Ingress on AKS with AGC,
cert-manager DNS-01, parameterized config
- kubernetes-gateway-aks.mdx: Walkthrough for Gateway API on AKS with
AGC, cert-manager HTTP-01 (gatewayHTTPRoute) and DNS-01 options
Cross-links added to existing kubernetes.mdx and kubernetes integration
pages.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Register new pages in deployment sidebar topics
Pages must be listed in deployment.topics.ts for the
starlight-sidebar-topics plugin to render them.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Remove AKS HTTP-01 tip from overview page
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix deploy commands: use env vars instead of hallucinated --parameter flag
Replace non-existent aspire deploy --parameter with environment
variables using the Parameters__<name> convention. Added note about
alternative config sources (appsettings.json, user secrets, interactive).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add full az CLI setup commands to Ingress walkthrough
Replace terse prerequisites with step-by-step az commands:
- Create resource group and AKS cluster with ALB/OIDC/workload identity
- Create and attach ACR
- Create ALB subnet and ApplicationLoadBalancer CRD
- Create Azure DNS zone and list name servers for delegation
- Install cert-manager with workload identity and Azure DNS
- Create managed identity, federated credential, ClusterIssuer
Gateway walkthrough cross-references the Ingress setup steps.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add BYO cluster callout and link to AddAzureKubernetesEnvironment
Both walkthroughs now clearly state they use a bring-your-own-cluster
model and link to the AKS integration page for Aspire-provisioned
clusters.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add bash/PowerShell tabs to az CLI setup commands
All multi-line az/kubectl commands now have both bash and PowerShell
tabs with correct line continuation characters and variable syntax.
Also added resource provider registration steps, updated reference
links to official Azure docs.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Rewrite Gateway API walkthrough as standalone HTTP-01 focused guide
- Make Gateway API doc fully standalone with its own AKS setup steps
(resource providers, cluster, ACR, ALB, cert-manager)
- Focus on HTTP-01 as the recommended TLS strategy (no DNS zone needed)
- Add complete ClusterIssuer setup for gatewayHTTPRoute solver
- Add DNS pointing section with az CLI commands (bash + PowerShell tabs)
- Add deploy section with both bash and PowerShell env var examples
- Add detailed 'How it works' explaining the full TLS bootstrap flow
- Add 'Why HTTP-01 works with Gateway but not Ingress' explanation
- Move DNS-01 to alternative section with cross-link to Ingress doc
- Reorder sidebar: Gateway API before Ingress (recommended first)
- Update overview page next steps to highlight Gateway as recommended
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: add ASPIREDURABLETASK001 diagnostic page and document Durable Task experimental APIs (#779)
Documents changes from microsoft/aspire#16533, which marks the Durable Task scheduler
and task hub APIs in Aspire.Hosting.Azure.Functions as [Experimental] with diagnostic
ID ASPIREDURABLETASK001.
- Add new diagnostics/aspiredurabletask001.mdx page describing the warning, affected
APIs, and suppression options.
- Update azure-functions-host.mdx to include a new 'Durable Task scheduler integration'
section explaining the experimental APIs with code examples.
- Add ASPIREDURABLETASK001 entry to the sidebar warnings list.
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [docs] Document AddEFMigrations and PublishAsMigrationBundle with publishContainer option (#774)
* docs: document AddEFMigrations and PublishAsMigrationBundle with publishContainer
Document the AddEFMigrations AppHost API and the new publishContainer: true
option for PublishAsMigrationBundle introduced in microsoft/aspire#16289.
- Add 'Automated EF migrations with AddEFMigrations' section covering:
- Package installation
- AppHost configuration via AddEFMigrations
- RunDatabaseUpdateOnStart for local run mode
- PublishAsMigrationScript and PublishAsMigrationBundle for publish pipeline
- New publishContainer: true option to wrap bundle in a container image
- Per-environment configuration (ACA Job, Docker Compose, Kubernetes)
- Artifact-only (no container) usage pattern
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Address PR review feedback on migrations.mdx
Agent-Logs-Url: https://github.com/microsoft/aspire.dev/sessions/e98f02d1-22c1-45c0-bac2-d26789008422
Co-authored-by: AndriySvyryd <6539701+AndriySvyryd@users.noreply.github.com>
---------
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: AndriySvyryd <6539701+AndriySvyryd@users.noreply.github.com>
* docs: add AddNextJsApp and publish methods for JS apps (13.3) (#765)
Document the new JavaScript publish APIs added in Aspire 13.3:
- AddNextJsApp: Next.js hosting with next dev, standalone output, and build validation
- PublishAsStaticWebsite: YARP-based static site serving with optional API proxy
- PublishAsNodeServer: Node.js SSR container (SvelteKit, TanStack Start)
- PublishAsNpmScript: Multi-stage npm script container (Nuxt, Remix, Astro SSR)
Adds framework reference table mapping each framework to its recommended publish method.
Documents changes from microsoft/aspire#15736
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Replace dashboard Copilot and MCP server docs with AI coding agents and APIs pages (#784)
* Replace dashboard Copilot and MCP server docs with AI coding agents and APIs pages
- Delete dashboard/copilot.mdx (feature removed) and redirect to new page
- Delete dashboard/mcp-server.mdx and redirect to get-started/aspire-mcp-server
- Add dashboard/ai-coding-agents.mdx covering CLI and MCP server usage
- Add dashboard/apis.mdx with write/read API reference
- Add note to aspire-mcp-server.mdx about dashboard MCP removal
- Rename sidebar group from 'AI features' to 'Data features'
- Update all cross-references across docs and localized files
* Update Dashboard:AI:Disabled default to true, clarify it only disables Copilot UI
* Fix invalid hash link to OTLP section in apis.mdx
* Remove Copilot UI references from dashboard/explore.mdx
* Document framework-specific gotchas for JS publish methods (#787)
* Document framework-specific gotchas for JS publish methods
Expands the JavaScript apps deployment doc with framework-specific guidance
covering the three new publish methods (PublishAsStaticWebsite,
PublishAsNodeServer, PublishAsNpmScript) added in Aspire 13.3.
- Add a Dev-mode API proxying subsection covering the API_HTTP injection and
per-framework dev-server proxy patterns (Vite, Astro, Angular).
- Expand the framework reference table with build entry points and the
framework-side configuration each publish method requires.
- Add a Framework-specific gotchas section with verified links to the
canonical framework docs for Nuxt, Astro SSR, SvelteKit, Next.js,
TanStack Start, Remix / React Router, Qwik City, Angular, and Vite.
- Cross-link from AddNextJsApp and AddViteApp on the JavaScript integration
page to the relevant deployment-page sections.
- Fix a pre-existing broken link to /fundamentals/service-discovery/overview/
introduced in #765.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Clarify API_HTTP and API_URL env var conventions
Address PR #787 review feedback:
- Explain that API_HTTP follows the service-discovery <RESOURCENAME>_<SCHEME>
convention and is added by WithReference (or by passing apiTarget to
PublishAsStaticWebsite).
- Clarify that API_URL is not auto-injected — it is a custom env var that
SSR-framework examples set explicitly via WithEnvironment.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Use API_HTTP consistently; drop fictional API_URL references
API_URL is not an Aspire convention — it was a custom variable used in the
sample repo. Use the actual auto-injected service-discovery variable
API_HTTP (<RESOURCENAME>_<SCHEME>) throughout the SSR gotchas so readers
can reproduce the examples without an extra WithEnvironment call.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [docs] Add Podman support for Docker Compose deployment (#764)
* docs: add Podman support for Docker Compose deployment (aspire#16074)
- Document Podman as a supported container runtime for Docker Compose deploys
- Describe auto-detection logic (parallel probe, prefer running, Docker tiebreaker)
- Add Podman-specific behavior note (podman-compose / service discovery)
- Document breaking change: IContainerRuntime → IContainerRuntimeResolver
- Update aspire doctor docs to reflect multi-runtime reporting
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Address review feedback: remove IContainerRuntime breaking change section
Per @davidfowl's review on PR #764, remove the 'Breaking change:
IContainerRuntime → IContainerRuntimeResolver' section from the Docker
Compose deployment doc. That guidance belongs elsewhere (if anywhere)
rather than in the Docker Compose deployment guide.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Remove DCP detection-parity sentence per review
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Apply doc-tester findings from end-to-end Podman validation
- aspire-doctor.mdx: replace synthetic example output with the real CLI
format observed on Aspire CLI 13.3.0 (✅/⚠️/❌ glyphs, 'v<version>:
running' prefix, '(<reason>) ← active' suffix, real header names).
Add a third example showing the explicit-configuration override.
- docker-compose.mdx: document the ASPIRE_CONTAINER_RUNTIME=docker|podman
override and call out the Podman ≥ 5.0.0 minimum (Ubuntu 24.04 ships
4.9.x and is rejected by aspire doctor; use Fedora 42+ or another
distro that packages Podman 5).
Verified against a clean Fedora 43 droplet with Podman 5.6.2:
aspire publish + aspire deploy completed end-to-end (25/25 steps),
podman-compose 1.5.0 was used automatically, and aspire doctor
reported each runtime/reason combination above verbatim.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Fowler <davidfowl@gmail.com>
* [docs] Add browser logs documentation (#775)
* docs: add browser logs documentation
Documents the BrowserLogs feature (WithBrowserLogs) and the new
Configure Tracked Browser dashboard command added in
microsoft/aspire#16531.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Move browser logs to integrations/devtools and address review feedback
- Move page from /dashboard/browser-logs to /integrations/devtools/browser-logs
(it documents an AppHost integration, not a dashboard telemetry feature)
- Use 'Aspire' branding instead of '.NET Aspire'
- Remove unused MDX imports (Aside, Steps, LearnMore)
- Drop unnecessary WithExternalHttpEndpoints from examples; clarify that
WithBrowserLogs works on any resource with an HTTP/HTTPS endpoint
- State the child resource naming pattern explicitly (<parent>-browser-logs)
- Add command IDs (open-tracked-browser, configure-tracked-browser,
capture-screenshot) alongside dashboard display names
- Document accepted UserDataMode config values (Shared/Isolated, case-insensitive)
- Note that per-resource keys take precedence over global keys
- Reference 'aspire secret set' for user-secrets initialization
- Add new section explaining browser process sharing and tab semantics:
one process per (executable, user-data-directory), one tab per session,
cross-AppHost adoption via CDP
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Fowler <davidfowl@gmail.com>
* Document the Aspire.Hosting.Browsers package on the browser logs page (#792)
* Document the `Aspire.Hosting.Browsers` package on the browser logs page
The browser logs feature now ships as a standalone hosting package
`Aspire.Hosting.Browsers`. The integration page didn't tell readers
which package to install — it jumped straight from the introduction
into a `WithBrowserLogs()` example, which left users guessing.
- Add an 'Install the package' section with the standard
`InstallPackage` component pointing at `Aspire.Hosting.Browsers`.
- Update the code example titles from `AppHost/Program.cs` to
`AppHost.cs` to match the Aspire 13.x convention.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add TypeScript AppHost samples to the browser logs page
The Aspire TypeScript codegen now exposes `withBrowserLogs(options?)`
on resources, mirroring the C# `WithBrowserLogs(...)` extension. Add
TypeScript variants alongside the C# samples following the same
`Tabs syncKey='aspire-lang'` pattern used on the PostgreSQL hosting
page, and fix the `InstallPackage` prop name to match the component
contract (`packageName`).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add TypeScript install path for the browser logs package
Mirror the PostgreSQL installation pattern: wrap install in an
`aspire-lang` Tabs block with a C# tab (CLI, file-based AppHost
directive, PackageReference) and a TypeScript tab (CLI plus the
`aspire.config.json` packages entry). The `InstallPackage` component
only covers C# install methods, so it can't represent the TypeScript
config workflow.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Use AddViteApp in browser logs samples
Browser logs apply to any HTTP/HTTPS resource, but a Vite frontend
makes the example more concrete (and matches a common scenario where
console output is what readers want to see). Use `AddViteApp` /
`addViteApp` in both code blocks.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Refine browser logs page after doc-tester pass
- Lead with 'any browseable resource' framing and call out that Vite
is just an example. Add a pointer to Aspire.Hosting.JavaScript so
readers know AddViteApp lives in a different package.
- Annotate the '../web' path so copy-pasters know what directory the
example expects.
- Chain the TypeScript fluent API directly off addViteApp(...) instead
of splitting through an intermediate const, matching the rest of the
TS code samples in the page.
- Link 'aspire secret set' to its CLI reference and clarify what
follow-up clicks of 'Save to user secrets' do.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Remove accidental Playwright MCP snapshot dump
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Link to JavaScript integration page instead of NuGet
Per docs convention, link to the in-site integration page for
Aspire.Hosting.JavaScript (where the Vite resource is documented)
rather than the NuGet listing. Drop the NuGet emoji link from the
Aspire.Hosting.Browsers package mention as well.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Address PR feedback: add ASPIREBROWSERLOGS001 article, use InstallPackage
- Create /diagnostics/aspirebrowserlogs001/ article and link the
diagnostic ID mention in the browser-logs page to it.
- Add the new diagnostic to the diagnostics overview table.
- Replace the hand-rolled C# install tab with the shared
<InstallPackage packageName="Aspire.Hosting.Browsers" /> component
for consistency with other integration pages. The TypeScript tab
keeps its hand-rolled aspire.config.json snippet.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [docs] Use `aspire destroy` in deployment cleanup tutorials (#790)
* Use `aspire destroy` in deployment cleanup tutorials
Replace the legacy clean-up steps in the getting-started deploy
tutorial and the Docker Compose / Azure Container Apps deployment
guides with `aspire destroy`, which now provides a unified,
interactive teardown flow:
- get-started/deploy-first-app.mdx: drop the per-target Tabs
(`aspire do docker-compose-down-env` / `az group delete`) in both
the C# and TypeScript pivots and call `aspire destroy` instead.
The command auto-detects the deployment target and shows what will
be removed before proceeding.
- deployment/docker-compose.mdx: replace the `aspire do
docker-compose-down-{env}` example in 'Clean up deployment' with
`aspire destroy`.
- deployment/azure/container-apps.mdx: replace the manual
`az group delete --name <rg>` example with `aspire destroy`.
Each cleanup step now includes a caution/danger admonition warning
that the destroy is irreversible. The default invocation prompts for
confirmation; `--yes` is mentioned only as the CI/automation override.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Use `aspire deploy --list-steps` in deploy tutorial protip
The `aspire do diagnostics` subcommand was removed from the CLI in
favour of the `--list-steps` flag exposed by every pipeline command
(`aspire deploy`, `aspire publish`, `aspire destroy`, `aspire do`).
Update both pivots of the get-started deploy tutorial to point
readers at `aspire deploy --list-steps` and link to the
`aspire deploy` reference instead of `aspire do`.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Replace stale `aspire do diagnostics` references with `--list-steps`
The `aspire do diagnostics` subcommand has been removed from the CLI.
The replacement is the `--list-steps` flag, which is exposed by every
pipeline command (`aspire deploy`, `aspire publish`, `aspire destroy`,
and `aspire do`) and lists the steps that would run for that command,
in execution order, without running them.
Update the explanation pages and CLI reference accordingly:
- deployment/pipelines.mdx: replace the dedicated `Discovering available
steps` example, the migration steps under 'Pipeline steps and
dependencies', and the post-migration tip Aside. Trim the descriptive
bullet list to what `--list-steps` actually outputs (no orphaned-step
detection or 'what-if' simulation language).
- whats-new/aspire-13.mdx: rewrite the 'Pipeline diagnostics' bullet to
describe `--list-steps` instead of a now-removed subcommand.
- reference/cli/commands/aspire-do.mdx: rewrite the 'Discovering
available steps' section and the corresponding example to use
`aspire do --list-steps`.
Verified against `aspire do --help` / `aspire deploy --help` on Aspire
CLI 13.3.0+be8c19e: `--list-steps` is documented as 'List the pipeline
steps that would be executed, without running them.'
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [docs] Document container tunnel enabled by default in Aspire 13.3 (#772)
* docs: document container tunnel enabled by default in Aspire 13.3
Add a new section to the What's new in Aspire 13.3 page describing
the container tunnel being enabled by default (aspire/aspire#14557).
- Explains what the tunnel is and why it matters
- Notes the ~3-4s startup delay for containers using host endpoints
- Shows how to opt out via ASPIRE_ENABLE_CONTAINER_TUNNEL=false
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Apply suggestions from code review
Co-authored-by: David Pine <david.pine@microsoft.com>
---------
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <david.pine@microsoft.com>
* [docs] Add ASPIREJAVASCRIPT001 diagnostic documentation (#809)
* Add ASPIREJAVASCRIPT001 diagnostic documentation
Documents the new ASPIREJAVASCRIPT001 experimental diagnostic introduced
in Aspire 13.3 for JavaScript hosting APIs (PublishAsStaticWebsite,
NextJsAppResource, PublishAsStaticWebsiteOptions).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add ASPIREJAVASCRIPT001 sidebar entry to reference.topics.ts
Agent-Logs-Url: https://github.com/microsoft/aspire.dev/sessions/6e9451d0-ae0b-4f1b-a00b-7ee333cbd3fc
Co-authored-by: IEvangelist <7679720+IEvangelist@users.noreply.github.com>
---------
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: IEvangelist <7679720+IEvangelist@users.noreply.github.com>
* docs: document ASPIRE_DCP_USE_DEVELOPER_CERTIFICATE env var
Add documentation for the new ASPIRE_DCP_USE_DEVELOPER_CERTIFICATE
environment variable introduced in microsoft/aspire#15718.
- Added the env var to the Common configuration table in app-host/configuration.mdx
- Added a dedicated section in app-host/certificate-configuration.mdx
explaining when and how to use the setting
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Document --list-steps and --no-build pipeline command options (#801)
Add shared option includes for --list-steps and --no-build, and
reference them from the aspire deploy, aspire publish, and aspire do
command pages. These options are exposed by every pipeline command
but were undocumented.
Also replace stale 'aspire do diagnostics' references in aspire-do.mdx
with 'aspire do --list-steps' (the diagnostics subcommand was removed
from the CLI; --list-steps is the replacement).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update pipeline --log-level to --pipeline-log-level in CLI docs (#789)
The pipeline commands (aspire do, aspire publish, aspire deploy) had a
--log-level option renamed to --pipeline-log-level to avoid overlap with
the global CLI --log-level / -l option.
Documents changes from microsoft/aspire#16596.
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: document ExcludeReferenceEndpoint for endpoint filtering
Documents the new EndpointAnnotation.ExcludeReferenceEndpoint property
introduced in microsoft/aspire#15558. Adds a subsection under
'Endpoint extension methods → Additional considerations' covering:
- How to opt an endpoint out of WithReference(resource) discovery
- Code examples for excluding and explicitly opting in by name
- Table of built-in integrations using this pattern (Keycloak,
CosmosDB/EventHubs/ServiceBus emulators)
- Backward-compatibility note (defaults to false)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Remove dashboard MCP configuration docs (#825)
The dashboard MCP server and its associated configuration have been
removed from Aspire in microsoft/aspire#15528. The MCP server is now
exclusively provided by the Aspire CLI (aspire agent mcp).
- Remove ASPIRE_DASHBOARD_MCP_ENDPOINT_URL from common configuration table
- Update ASPIRE_DASHBOARD_UNSECURED_ALLOW_ANONYMOUS description (remove MCP auth mode reference)
- Remove the entire Dashboard MCP configuration section
- Remove stale mention of HTTP-based dashboard MCP auth in aspire-mcp-server.mdx
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <david.pine@microsoft.com>
* [docs] Add ASPIREJAVASCRIPT001 diagnostic documentation (#805)
* Add ASPIREJAVASCRIPT001 diagnostic documentation
Documents the new ASPIREJAVASCRIPT001 compiler warning introduced in
Aspire 13.4 for experimental JavaScript hosting and publishing APIs
(PublishAsStaticWebsite, PublishAsNodeServer, PublishAsNpmScript,
AddNextJsApp, DisableBuildValidation). Previously these APIs used
ASPIREEXTENSION001; this rename requires users to update any
suppressions they have in their projects.
Adds aspirejavascript001.mdx and updates diagnostics/overview.mdx.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Apply suggestion from @eerhardt
* Small reverts
* Revert duplication
---------
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
* Fix release build diagnostics sidebar (#831)
Add the missing ASPIREBROWSERLOGS001 diagnostics page to the sidebar topics config so starlight-sidebar-topics no longer rejects the page during prerender.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add --dashboard-url and --api-key options to aspire agent mcp and aspire otel command docs (#817)
Documents the new standalone dashboard connection options added in
microsoft/aspire#15595. Users can now query telemetry from a standalone
Aspire Dashboard (not managed by an AppHost) using --dashboard-url and
optionally --api-key for secured dashboards.
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [docs] Document Python starter template migration to TypeScript AppHost (aspire-py-starter) (#823)
* docs: document Python starter template migration to TypeScript AppHost
The aspire-py-starter template was migrated from dotnet new (C# AppHost)
to the Aspire CLI template system (TypeScript AppHost) in aspire#15574.
- Add 13.3 what's-new entry for the Python starter template change
- Update aspire-sdk-templates.mdx to reflect TypeScript AppHost and new
--use-redis-cache option
- Update aspire-new.mdx commands table and add py-starter-specific options
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update src/frontend/src/content/docs/reference/cli/commands/aspire-new.mdx
Co-authored-by: David Fowler <davidfowl@gmail.com>
---------
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <david.pine@microsoft.com>
Co-authored-by: David Fowler <davidfowl@gmail.com>
* docs: add polyglot custom domain support for Azure Container Apps (#811)
The ConfigureCustomDomain API is now available in polyglot AppHosts
(TypeScript, Python, Java) following microsoft/aspire#15811.
Update the TypeScript tab in the custom domains section with working
code examples, replacing the previous note that said the API was
not yet available.
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [docs] Document TypeScript validation before AppHost startup (#812)
* docs: document TypeScript validation before AppHost startup
TypeScript AppHosts now run tsc --noEmit before starting, which
stops aspire run/publish when type errors are present. Document
this behavior including watch mode recovery and startup overhead.
Documents changes from microsoft/aspire#16689.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update TypeScript validation section in documentation
Clarified TypeScript validation process and its impact on startup time.
---------
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Sébastien Ros <sebastienros@gmail.com>
* docs: document VS Code editor indicators (gutter icons, code lens, health checks) (#816)
Documents the gutter icon shapes, code lens health check details, sidebar
health check tree nodes, and expand-all button introduced in
microsoft/aspire#15688.
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: document integratedBrowser as new default for aspire.dashboardBrowser (#810)
Documents the new 'integratedBrowser' setting value added in
microsoft/aspire#15896. Updates the default shown in the settings table
and adds a dedicated 'Dashboard browser options' section listing all
available values with descriptions.
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: add Restore command and enableAutoRestore setting for VS Code extension (#813)
Documents the auto-restore feature added in microsoft/aspire#15546:
- Add 'Restore' command to the Commands table
- Add 'aspire.enableAutoRestore' setting to the Extension settings table
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update src/frontend/src/content/docs/app-host/certificate-configuration.mdx
* Update src/frontend/src/content/docs/app-host/certificate-configuration.mdx
* Update src/frontend/src/content/docs/app-host/configuration.mdx
* [docs] Document command result output for resource commands (#822)
* docs: document command result output for resource commands
Document the new CommandResults.Success(result, format) overload and
CommandResultFormat enum introduced in microsoft/aspire#15622.
Covers:
- Returning plain-text and JSON structured output from resource commands
- How results flow through Dashboard (TextVisualizerDialog), CLI (stdout),
and MCP tools (TextContentBlock)
- The CommandResultFormat enum values (None, Text, Json)
- Replica aggregation behavior for result data
- CLI piping tip using stderr/stdout separation
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix command result output docs against actual public API
The original draft from PR #15622 codegen had several inaccuracies that
would have prevented the examples from compiling:
- ExecuteCommandResult exposes Data (CommandResultData?), not Result and
ResultFormat. ErrorMessage is now [Obsolete]; Message replaces it for
both success and failure messages.
- CommandResults.Success(message, result, format) takes a status message
as the first argument; the previous samples omitted it.
- CommandResultFormat is { Text, Json, Markdown } — None was removed
from the public API and Markdown was never documented.
- The Failure overload accepts the same payload shape, and the
CommandResultData.DisplayImmediately flag auto-opens the dashboard
visualizer.
Also adds parallel TypeScript examples (using the object-literal
ExecuteCommandResult / CommandResultData shape) under aspire-lang Tabs,
mirrors the existing example using Message in the property bullet list,
and documents both the toast/CLI/MCP routing and the visualizer locking
behavior for Json and Markdown.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Use realistic access-token scenario and add CLI invocation section
- Replaces the placeholder `getConnectionString` / `GetConnectionStringAsync`
helpers with a self-contained `issue-access-token` example. The text
variant returns the raw token; the JSON variant returns token + expiresAt
+ scopes. C# uses `RandomNumberGenerator.GetBytes(32)`; TypeScript uses
`crypto.randomUUID()`. Both variants compile/type-check verbatim.
- Adds an "Invoke commands from the CLI" subsection documenting:
- The `aspire resource <resource> <command>` syntax.
- The stdout/stderr split (status to stderr, payload to stdout).
- That `Markdown` payloads are rendered in the terminal, not raw.
- The 0/non-zero exit-code contract for scripting.
- A realistic `jq` pipe and a script branch on the exit code.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add TypeScript code samples throughout custom-resource-commands
Wraps the C#-only walkthrough sections (Add custom commands, Execute
command logic, Update command state logic, Test the custom command,
Handle command execution results) in <Tabs syncKey="aspire-lang">
with parallel TypeScript examples. The TypeScript samples follow the
RpsArena playground pattern: inline withCommand registration, HTTP-based
command logic via getEndpoint + fetch, and plain object-literal results.
Adds <Aside> callouts where the TypeScript SDK genuinely lacks a feature
the C# AppHost has:
- UpdateCommandStateContext.resourceSnapshot (no equivalent)
- Programmatic command execution via ResourceCommandService (C# only)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Fowler <davidfowl@gmail.com>
* Fix build error (#843)
* [docs] Add aspire destroy command documentation (#769)
* Add aspire destroy command documentation
Documents the new aspire destroy CLI command introduced in
microsoft/aspire#16097. Adds a full command reference page with
synopsis, description, options, and examples; updates the CLI
overview to include an aspire destroy section; and registers the
new page in the sidebar.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Match aspire destroy options to release/13.3 CLI
- Rename --log-level to --pipeline-log-level (microsoft/aspire#16596)
- Add --list-steps, --no-build, and global --log-level (-l) entries
via shared includes, matching aspire-deploy/aspire-publish docs
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Fowler <davidfowl@gmail.com>
* [docs] Add --list-steps sample output to aspire do and pipelines pages (#847)
The reference docs for aspire do and the deployment/pipelines conceptual
page already document the --list-steps flag, but neither shows what the
output actually looks like. Add a short, canonical numbered-tree sample
(matches the formatter in microsoft/aspire#16085 and its snapshot tests)
so readers can see at a glance what to expect — including the connectors
used for steps with deps only, deps and tags, and steps with no
dependencies.
Context: microsoft/aspire.dev#837 (item #2), follow-up polish to #801.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [docs] Add Logger property to ExecuteCommandContext docs (#818)
* docs: document Logger property on ExecuteCommandContext
Add the new Logger property to the ExecuteCommandContext properties list
and update code examples to use context.Logger directly instead of
resolving ILogger from the service provider.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update Logger description to mention dashboard and aspire logs command
---------
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: James Newton-King <james@newtonking.com>
* docs: update Kubernetes deployment docs to use WithHelm chart options (#840)
Update the Helm chart metadata section to use the new WithHelm(...)
API that consolidates chart name, version, and description configuration.
The previous WithProperties API for HelmChartName/HelmChartVersion/
HelmChartDescription is now internal.
Relates to microsoft/aspire#16759
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Document dashboard notification center (#850)
Add a Notification center section to the explore dashboard page describing the bell icon, notifications dialog, View response action, and Dismiss all. Update references from toast notifications to the notification center. Add Markdown to the text visualizer format list. Update custom-resource-commands.mdx to link to the notification center instead of referencing toasts. Add notification center screenshots.
* Update Microsoft Foundry docs (#845)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Document publish summary output (#844)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: add package manager requirements for TypeScript AppHosts (#841)
Document that Yarn Classic (v1) is not supported for TypeScript AppHosts.
Users must use Yarn 4+, npm, pnpm, or Bun. Adds a Package managers section
to the TypeScript AppHost project structure page with a supported-toolchains
table and a caution callout explaining the Yarn Classic restriction and how
to upgrade.
Documents changes from microsoft/aspire#16792.
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [docs] Update agent init docs for new interactive flow, skill locations, and dotnet-inspect skill (#827)
* docs: update agent init docs for new interactive flow and locations
- Update ai-coding-agents.mdx to document the new two-phase interactive
flow: first select skill locations, then select skills to install
- Document the new Standard (.agents/skills/) location supported by
VS Code, GitHub Copilot, and OpenCode
- Document all four skill locations with their directories
- Document the new dotnet-inspect skill and its file layout
- Update aspire-agent-init.mdx command reference to describe the new
interactive multi-step setup flow
Documents changes from microsoft/aspire#15022
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Apply suggestions from code review
Co-authored-by: David Pine <david.pine@microsoft.com>
---------
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <david.pine@microsoft.com>
* [docs] AppHost eventing: document OnBeforeStart, OnBeforePublish, OnAfterPublish builder extension methods (#821)
* docs: add OnBeforeStart, OnBeforePublish, OnAfterPublish builder extension methods
Documents the new convenience extension methods added in microsoft/aspire#14119
that allow subscribing to AppHost-level events directly on IDistributedApplicationBuilder.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Apply suggestions from code review
Co-authored-by: Alex Crome <afscrome@users.noreply.github.com>
---------
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <david.pine@microsoft.com>
Co-authored-by: Alex Crome <afscrome@users.noreply.github.com>
* docs: update Microsoft Foundry hosting integration to include deployment resource details
* docs: update TypeScript endpoint property samples (#854)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: document duplicate polyglot capability analyzer (#856)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Prep aspire.dev for Aspire 13.3 release (May 7, 2026) (#860)
* Prep aspire.dev for Aspire 13.3 release (May 7, 2026)
Cuts the docs site over to 13.3.0 stable. Lands one tooling fix
(partial-class nested types) and the matching renderer change so the
new FoundryModel provider classes surface on the API reference page,
then refreshes every generated data file from the release/13.3 darc
feed (darc-pub-microsoft-aspire-5bd693ae).
Tooling
- PackageJsonGenerator: emit `nestedTypes` (full names of public
nested types) on every CanonicalType. Roslyn merges partials, so
GetTypeMembers() picks up nested types contributed by every source
file (e.g. FoundryModel + FoundryModel.Generated.cs). Filters out
compiler-generated and non-public types.
- PackageJsonGenerator.Tests: regression test for partial-class
nested-type collection (13/13 pass).
- update-schemas.ts: new --ref <sha|ref> flag so the aspire-config
schema can be fetched by SHA when the release tag isn't yet
published. Defaults to v<version> as before.
Renderer
- csharp-api-markdown.ts and pages/.../[type]/index.astro: render a
new "Nested Types" section with kind pills and summaries when
type.nestedTypes is populated. FoundryModel now surfaces all 14
provider classes (AI21Labs, Anthropic, BlackForestLabs, Cohere,
Core42, DeepSeek, Local, Meta, Microsoft, MistralAI, OpenAI,
StabilityAI, XAI, plus the namespace root).
AppHost
- Bump Aspire.AppHost.Sdk and the two PackageReferences from 13.2.0
to 13.3.0 in src/apphost/Aspire.Dev.AppHost.
Doc sweep (13.2.0 -> 13.3.0)
- support.mdx: 13.3 supported row + 13.2 demoted to out-of-support;
Last updated badge -> May 7, 2026.
- aspireconf/index.mdx: branding 13.2 -> 13.3.
- Code samples in app-host/typescript-apphost, get-started/aspire-sdk,
install-cli, add-aspire-existing-app,
extensibility/multi-language-integration-authoring,
reference/cli/commands/aspire-{add,init,new},
integrations/databases/postgres/postgres-host.
Regenerated data
- aspire-integrations.json: 156 packages.
- pkgs/*.json: 94 Aspire packages at 13.3.x (deleted matching
13.2.0 siblings); CommunityToolkit packages from nuget.org as before.
- ts-modules/*.json: 54 modules.
- twoslash/aspire.d.ts: regenerated bundle (31 DTOs, 29 enums,
235 handle types).
- samples.json (15), github-stats.json (5),
schemas/aspire-config.13.3.0.schema.json + index.json.
Tests
- Unit (vitest): 132/132 (one fixture-path bump for the regenerated
Aspire.Hosting.13.3.0.json fixture).
- .NET: PackageJsonGenerator 13/13, AtsJsonGenerator 5/5.
- Lint: clean.
- Playwright: 112 passed, 6 unrelated cookie-consent failures
(pre-existing, not touched by this change), 1 flaky WCAG case.
* Fix support page: 13.2.x latest patch is 13.2.4 (April 24, 2026)
The support table incorrectly listed 13.2.3 (April 22, 2026) as the latest 13.2.x patch. Aspire.Hosting 13.2.4 was published to nuget.org on 2026-04-24.
* docs: update CLI command docs for non-interactive options (aspire#16235) (#744)
- aspire update: add --yes/-y and --nuget-config-dir options, remove
outdated note that non-interactive mode is unsupported
- aspire agent init: add --workspace-root, --skill-locations, and
--skills options
- aspire new: update description for non-interactive error behavior,
add --suppress-agent-init option, remove outdated limitation note
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <david.pine@microsoft.com>
* [release/13.3] Restructure VS Code extension page (polyglot + screenshots) (#849)
* Backport: Restructure VS Code extension page for 13.3
Ports the polyglot/13.3 restructure of the VS Code extension docs from docs/vscode-extension-polyglot:
- Restructured aspire-vscode-extension.mdx (intro, Install, Getting started, Scaffold + integrations, Live editor integration with CodeLens/gutter/title-bar buttons, Aspire view, Run/debug/deploy with launch.json examples, Language coverage, Feedback).
- Added code-extension-{codelens,sidebar,debug}{,-light}.png screenshot assets.
- Updated configuration.mdx 'Associate the schema in Visual Studio Code' note to point to the extension.
* Address Copilot review: grammar fixes and remove misleading deploy command from launch example
* Remove redundant intro sentence about live state surfaces
* Wrap Getting started in Steps; mention manual schema fallback for users without the extension
* Correct gutter icon table and editor title button labels to match shipped extension
* Update New Aspire project screenshot to show new template list
* Use distinct dark and light New Aspire project screenshots
* Use distinct light theme image for Aspire panel sidebar
* Use new image for Aspire panel dark theme
* Use new image for Aspire panel light theme
* Remove width=400 on Aspire view image so full window screenshot renders responsively
* Trim transparent padding from screenshots; ignore generated twoslash types
* Use actual dark theme screenshot for Aspire sidebar
* Add debug screenshots (dark+light) and re-trim all extension screenshots
* Remove install + live-editor screenshots
* Move Aspire view screenshot up under Live editor integration
* Replace new project screenshots and trim transparent borders
* Move debug sessions screenshot below launch.json examples
* Caption new project screenshot
* Tighten new project caption
* Remove center alignment from new project caption
* Reword intro lede
* docs: update multi-language integration guide for ATS-first API design (#756)
Documents the getter-only-to-async-method behavior introduced in
microsoft/aspire#16403 and adds a new 'Callback context types and the
ATS-first editor pattern' section explaining:
- How getter-only C# properties map to async methods in generated
TypeScript SDKs, while mutable-collection properties remain as
readonly getters
- The ATS-first editor/facade pattern for callback context types
(EnvironmentEditor, etc.) that should be used instead of
ExposeProperties = true on callback context classes
- How to define, export, and consume callback extension methods like
withEnvironmentCallback, withArgsCallback, and withUrls
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: add Durable Task Scheduler section to Azure Functions hosting docs (#820)
Documents the new DTS support added in microsoft/aspire#13711.
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update TypeScript Dockerfile builder docs (#846)
* Update TypeScript Dockerfile builder docs
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Clarify API examples for TypeScript AppHosts
Removed unnecessary note about C# method names in API examples.
* Update documentation for DockerfileBuilderCallbackContext
Clarify the usage of DockerfileBuilderCallbackContext in TypeScript.
* Document TypeScript Docker Compose APIs
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add TypeScript Docker integration examples
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update src/frontend/src/content/docs/integrations/compute/docker.mdx
Co-authored-by: David Pine <david.pine@microsoft.com>
* Update src/frontend/src/content/docs/app-host/withdockerfile.mdx
Co-authored-by: David Pine <david.pine@microsoft.com>
* Update src/frontend/src/content/docs/deployment/docker-compose.mdx
Co-authored-by: David Pine <david.pine@microsoft.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <david.pine@microsoft.com>
* [docs] Add aspire destroy command reference documentation
* Add aspire destroy command reference documentation
Documents the aspire destroy command including the new requirement
that --yes must be passed when using --non-interactive.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Address aspire destroy docs review feedback
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Document aspire destroy Docker Compose output
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Fowler <davidfowl@gmail.com>
* docs: update aspire init and add-to-existing-app for skill-driven aspirification (#776)
Document the new two-phase aspire init behavior introduced in microsoft/aspire#15918:
- aspire init now drops a skeleton AppHost + aspire.config.json and installs
the aspireify agent skill instead of performing full project wiring itself
- The --source and --version options are deprecated
- Update aspire-init.mdx: new description, aspireify skill section, updated examples
- Update add-aspire-existing-app.mdx: explain the two-phase init flow for both
C# and TypeScript AppHosts
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Pin AppHost to Aspire 13.2.4
* Document Azure HTTPS endpoint upgrades (#867)
Covers WithHttpsUpgrade behavior for Azure App Service and Azure Container Apps deployment docs. References microsoft/aspire.dev#833 item 19 and microsoft/aspire#16060.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: document HTTP command result mode (#866)
* docs: document HTTP command result mode
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: use Node app in HTTP command TS sample
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: chain TypeScript HTTP command sample
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: add Express HTTP command endpoint sample
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: document ASPIRE_ENVIRONMENT for AppHost (#868)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update MCP docs for Aspire 13.3 (#865)
Align the AI agent and MCP CLI reference docs with the Aspire 13.3 command surface, including current skill options and standalone dashboard MCP options.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [docs] Document unified withEnvironment API and IExpressionValue for multi-language AppHosts (Aspire 13.3) (#814)
* Document unified withEnvironment API and IExpressionValue for multi-language AppHosts
- Update multi-language-integration-authoring.mdx:
- Expand the union types example to show the full withEnvironment union
including IExpressionValue
- Add new IExpressionValue section explaining the interface, its role, and
how to implement it in custom types
- Add migration table from old withEnvironment* aliases to unified API
- Update supported types table to list IExpressionValue
- Update aspire-13-3.mdx whats-new with a new section covering the unified
withEnvironment API, the IExpressionValue interface, and the deprecation
of the per-kind alias methods
Documents changes from microsoft/aspire#15649
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Address withEnvironment docs review
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Sebastien Ros <sebastienros@gmail.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: maddymontaquila <12660687+maddymontaquila@users.noreply.github.com>
* Document MaxResourceCount telemetry limit option for dashboard (#797)
Add MaxResourceCount to the TelemetryLimits configuration table in the
dashboard configuration docs. This new option (default 10,000) limits the
number of resources tracked by the dashboard to prevent unbounded memory
growth in long-running sessions with dynamic services or high-cardinality
peer addresses.
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Azure AI Foundry Prompt Agents Support (#853)
* expand hosted agents, adds prompt agents
* feat: Add light mode images for agent send message and responses in Azure AI Foundry integration
Co-authored-by: Copilot <copilot@github.com>
* changes images
* adds typescript samples
Co-authored-by: Copilot <copilot@github.com>
---------
Co-authored-by: Copilot <copilot@github.com>
* Port AppHost path config docs to release/13.3 (#870)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [docs] Add AddNextJsApp and publish methods for JavaScript apps (Aspire 13.3) (#767)
* docs: add TypeScript AppHost samples for JavaScript apps
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: use JavaScript backends in JS app samples
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: reorganize JavaScript deployment guidance
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: align JavaScript integration apphost samples
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: add JavaScript AppHost language selector
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: use synced tabs for JavaScript AppHost samples
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: update AppHost language tab guidance
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: surface JavaScript deployment guidance earlier
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: clarify build-only JavaScript resources
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: document build-only validation escape hatch
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: David Fowler <davidfowl@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Maddy Montaquila <maleger@microsoft.com>
* Update Kubernetes docs to use WithHelm for Helm chart options (#858)
Replace deprecated WithProperties(k8s => k8s.HelmChartName = ...) examples
with the consolidated WithHelm(helm => helm.WithChartName(...)) API introduced
in microsoft/aspire#16759 / microsoft/aspire#16802.
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [whats-new] Expand 13.3 release notes (#838)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Mitch Denny <mitch@mitchdenny.com>
Co-authored-by: James Newton-King <james@newtonking.com>
Co-authored-by: David Fowler <davidfowl@gmail.com>
Co-authored-by: David Pine <david.pine@microsoft.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: JamesNK <303201+JamesNK@users.noreply.github.com>
* docs: update dashboard docs to reflect removal of in-dashboard GitHub Copilot (#808)
Co-authored-by: IEvangelist <7679720+IEvangelist@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: JamesNK <303201+JamesNK@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Maddy Montaquila <maleger@microsoft.com>
* Remove installation images for Aspire extension (#875)
Removed images related to installing the Aspire extension and updated the documentation accordingly.
This is breaking the release/13.3 build.
* Simplify MaxResourceCount description in documentation
Removed the explanation for MaxResourceCount limit in the dashboard configuration documentation…
* [release/13.3] Stabilizing builds in preparation for 13.3 release (#16566)
* [release/13.3] Stabilizing builds in preparation for 13.3 release
- Flip StabilizePackageVersion default to true in eng/Versions.props
- Drop the compute_version_suffix step from ci.yml so PR builds use the stabilized version
- Pin Aspire.AppHost.Sdk import to 13.3.0 in RepoTesting.targets
- Pin all stabilizable Aspire packages to 13.3.0 in Directory.Packages.Helix.props
(packages whose csproj sets SuppressFinalPackageVersion=true keep $(PackageVersion))
- Skip preview-only AppHosts (Kusto, Foundry, Keycloak, Kubernetes, Maui) in the
TypeScript polyglot validation script (see #15335)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [release/13.3] Skip tests blocked by suppressed-package stabilization gap
Two test buckets cannot run on a stabilized branch because they exercise NuGet
restore against Aspire.Hosting.* packages that have SuppressFinalPackageVersion=true
and therefore only ship as prerelease (e.g. 13.3.0-dev.<sha>) — but the stabilized
build asks for >= 13.3.0 stable.
Polyglot SDK Validation:
- Add 'Aspire.Hosting' to the skip list in test-typescript-playground.sh (it
transitively depends on Aspire.Hosting.Azure.Kubernetes via aspire.config.json).
- Apply the same skip block to test-python-playground.sh and test-java-playground.sh
(the 13.2 PR only updated the TypeScript script).
Cli.EndToEnd-KubernetesDeploy* (11 files):
- Mark each [Fact] with [ActiveIssue(#15335)]. The proper fix is the dynamic
version computation tracked by #15335 (PR #15681). When that lands the
ActiveIssue tags can be removed.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Remove MarkupString from SpanDetails and StructuredLogDetails resource strings (#16584)
Replace HTML-embedded resource strings with plain label strings and
move the <strong> formatting into Razor markup directly. This eliminates
the need for MarkupString casts and string.Format for these toolbar items.
* [release/13.3] Ensure compute environment prepare waits for validation (#16583)
* Ensure compute environment prepare waits for validation
When Foundry is used with another compute environment, the compute environments get confused about who takes ownership of which compute.
Make all compute-environment prepare pipeline steps depend on the shared validate-compute-environments step so before-start cannot race environment validation.
Add diagnostics coverage for a mixed Foundry hosted-agent and Azure Container Apps app.
Cover deployment target lookup returning null for a different compute environment.
* Fix tests
---------
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
* [release/13.3] Normalize App Service Application Insights Bicep identifiers (#16564)
* Initial plan
* Normalize app service app insights bicep identifiers
Agent-Logs-Url: https://github.com/microsoft/aspire/sessions/e848458a-5173-4241-b442-80d01de3d5c2
Co-authored-by: eerhardt <8291187+eerhardt@users.noreply.github.com>
* Preserve app insights bicep suffix separators
Agent-Logs-Url: https://github.com/microsoft/aspire/sessions/e848458a-5173-4241-b442-80d01de3d5c2
Co-authored-by: eerhardt <8291187+eerhardt@users.noreply.github.com>
* Address PR feedback
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: eerhardt <8291187+eerhardt@users.noreply.github.com>
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
* [release/13.3] Fix TypeScript AppHost package manager detection (#16598)
* Fix TypeScript package manager detection
Treat package-lock.json as an npm marker and limit parent directory package manager probing to the AppHost directory's direct parent. Log the marker used to select the TypeScript AppHost package manager.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix TypeScript AppHost path comparisons
Use OS-appropriate path comparison when deciding whether to skip root and home parent directories for package manager detection.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Preserve same-directory yarn marker precedence
Keep yarn markers ahead of package-lock.json within the same candidate directory while still allowing a local npm lockfile to beat parent-directory yarn markers.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Remove yarn directory package manager hint
Only use file-based yarn markers for TypeScript AppHost package manager detection and update the resolver test accordingly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Address TypeScript toolchain review feedback
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Sebastien Ros <sebastienros@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [release/13.3] Fix Windows detached AppHost launcher (#16572)
* Fix Windows detached AppHost launcher
Use the Windows DETACHED_PROCESS creation flag when launching the detached child CLI process so aspire start is not tied to the launching console lifetime. Keep the existing new process group and restricted handle inheritance behavior.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Clarify Windows detach launcher comment
Document that the detached Windows flag combination follows established daemonization patterns used by libuv/Node.js and GitHub CLI, without over-claiming Docker parity.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Remove Windows detach unit test
Remove the unit test coverage for the Windows detached process creation flags while keeping the implementation change and manual repro validation.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: David Fowler <davidfowl@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [release/13.3] Validate build-only container references in the pipeline (#16582)
* Validate build-only container references in the pipeline
Add the publish/deploy validation step and implement the opt-out by clearing its RequiredBySteps during pipeline configuration.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix tests
* PR feedback
Move DisableBuildOnlyContainerValidation to the Pipeline.
* PR feedback
* Fix tests
* Address build-only container validation feedback
Ensure manifest publishing runs the build-only container validation step and strengthen tests to cover mixed consumed and unconsumed build-only containers.
* Revert publish-manifest changes.
* Apply suggestion from @eerhardt
---------
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [release/13.3] Normalize CLI yes/no prompts (#16597)
* Normalize CLI yes/no prompts
Use single-key confirmation prompts for CLI yes/no choices so y/n answers are accepted without arrow-key selections while preserving [Y/n] and [y/N] defaults.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Prefer local hive versions in aspire add
Treat the configured local hive as a local build channel so aspire add keeps generated AppHosts on the same CLI/SDK version and writes the local NuGet source when needed.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Revert "Prefer local hive versions in aspire add"
This reverts commit 682178778ffedf19ddbffc863b88a714b2658f05.
---------
Co-authored-by: Sebastien Ros <sebastienros@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [release/13.3] Publish native Aspire CLI tool packages (#16611)
* fix(publishing): stage native CLI tool packages
Download RID-specific Aspire.Cli tool packages from native build artifacts and stage them in the shipping packages directory so publishing can include them.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(publishing): validate CLI package RIDs
Compare discovered CLI archives and RID-specific tool packages against the expected clipack RIDs, require exactly one pointer package, and summarize publish output without listing every NuGet package.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Ankit Jain <radical@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [release/13.3] Rename pipeline --log-level to --pipeline-log-level to avoid CLI log overlap (#16596)
* Rename pipeline --log-level to --pipeline-log-level to avoid CLI log overlap
The pipeline commands (do, publish, deploy, destroy) had a --log-level option
that collided with the global CLI --log-level/-l option. When a user passed
--log-level Debug to control pipeline verbosity, Program.ParseLoggingOptions()
also picked it up and cranked CLI internal logging to Debug, flooding output
with mixed noise.
Rename the pipeline-specific option to --pipeline-log-level so the two
concerns are cleanly separated:
- --log-level / -l (global, recursive) controls CLI internal logging
- --pipeline-log-level (pipeline commands only) controls pipeline step output
The value is still forwarded as --log-level to the AppHost process, which is
correct since the AppHost has its own --log-level parameter.
Also adds tests verifying the separation and argument forwarding.
* Rename s_logLevelOption to s_pipelineLogLevelOption
* [release/13.3] Fallback to junctions if either creating OR evaluating symlinks fails (#16618)
* Fallback to junctions if either creating OR evaluating symlinks fails
* Update src/Aspire.Cli/Utils/ReparsePoint.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update outdated test verified results
* Regenerate the verified file
---------
Co-authored-by: David Negstad <David.Negstad@microsoft.com>
Co-authored-by: David Negstad <50252651+danegsta@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* [release/13.3] Fix TypeScript AppHost generated port ranges (#16649)
* Fix TypeScript AppHost generated port ranges
Use a shared AppHost profile port generator for CLI templates, init, and TypeScript AppHost scaffolding so generated dashboard and service profile ports avoid the Windows ephemeral range. Add regression coverage for the generated TypeScript apphost.run.json ports.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* PR feedback
---------
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [release/13.3] Fix unbounded collection growth in TelemetryRepository (#16590)
* Fix unbounded collection growth in TelemetryRepository and related types
- Add MaxResourceCount option to TelemetryLimitOptions (default 10,000)
to cap _resources growth. Throws on limit exceeded.
- Clear _logScopes, _logPropertyKeys on ClearStructuredLogs (full clear)
and remove per-resource property keys on per-resource clear.
- Clear _traceScopes, _tracePropertyKeys, _spanLinks on ClearTraces
(full clear) and clean up span links and property keys per-resource.
- Clear _meters alongside _instruments in OtlpResource.ClearMetrics.
- Add internal const limits on TelemetryRepository for resource views
(10,000), instruments (10,000), dimensions (10,000), known attribute
value keys (10,000), and values per key (10,000).
- Enforce instrument limit in OtlpResource.AddMetrics.
- Enforce resource view limit in OtlpResource.GetView.
- Enforce dimension limit in OtlpInstrument.FindScope.
- Cap KnownAttributeValues keys and per-key value lists in
OtlpInstrument.CreateDimensionScope.
- Add clarifying comments to fields describing their bounds.
* Add limit enforcement tests and fix uncaught exceptions from resource limit
- Add TelemetryLimitTests with 5 tests for resource and instrument limits
- Add maxResourceCount parameter to CreateRepository test helper
- Wrap GetOrAddResource calls in GetPeerResource (return null), CalculateTraceUninstrumentedPeers, and OnPeerChanged with try/catch
- Fix _meters comment to not claim an unenforced bound
- Document TOCTOU soft-cap behavior on resource limit check
* Reset HasTraces/HasLogs and clear unviewed error logs on full clear
- ClearTraces full-clear now resets HasTraces on all resources
- ClearStructuredLogs full-clear now resets HasLogs on all resources and clears _resourceUnviewedErrorLogs
* Remove redundant per-telemetry-type resource limit tests
* Add scope and instrument limits with TryGetValue pattern
- Add MaxScopeCount limit to TryGetOrAddScope, using TryGetValue instead
of GetValueRefOrAddDefault to avoid add-then-remove on overflow
- Refactor instrument add in OtlpResource to use TryGetValue + count check
before inserting, removing the add-then-remove pattern
- Fix AddLogs failure count: count log records, not scopes
- Fix AddMetrics failure count: count data points, not metrics
- Add tests for resource limit, scope limit, and correct failure counting
* Move Ingress and Gateway extension methods to Aspire.Hosting namespace (#16633)
KubernetesGatewayExtensions and KubernetesIngressExtensions were in
the Aspire.Hosting.Kubernetes namespace, requiring users to add an
explicit using directive. Move them to Aspire.Hosting to match the
convention used by other extension methods like
KubernetesEnvironmentExtensions and KubernetesServiceExtensions.
Co-authored-by: Mitch Denny <mitch@mitchdenny.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Remove obsolete ATS export shims (#16628)
Remove obsolete internal compatibility shims from the ATS export surface so generated polyglot SDKs only expose the unified methods.
Co-authored-by: Sebastien Ros <sebastienros@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [release/13.3] Add BrowserLogs tracked browser sessions (#16637)
* Add BrowserLogs CDP transport seam
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Use CDP pipe for BrowserLogs owned browsers
Switch owned tracked-browser launches to a private CDP pipe, keep WebSocket adoption as an opt-in seam, and add session/persistent process lifetime configuration.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Remove BrowserLogs persistent lifetime
BrowserLogs pipe-launched browsers are always session scoped because Chromium exits when the CDP pipe closes. Remove the public lifetime option and mark public BrowserLogs types experimental.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Split BrowserLogs pipe launcher partials
Move platform-specific native launch logic into Windows and Unix partial classes while keeping the shared launcher entry points in the common file.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Use posix_spawn for BrowserLogs Unix pipe launches
Replace the managed fork/exec launcher with posix_spawn file actions so Chromium still receives CDP pipe fds 3 and 4 without running managed code in a forked child.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Move BrowserLogs to Aspire.Hosting.Browsers
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Move BrowserLogs tests to Browsers assembly
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update CI snapshots after BrowserLogs move
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update TypeScript capabilities snapshot
Remove the BrowserLogs capability from the Hosting assembly scanner snapshot now that BrowserLogs lives in Aspire.Hosting.Browsers.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Remove BrowserLogs friend assembly access
Stop relying on InternalsVisibleTo for the Browsers package and its tests by source-sharing the BrowserLogs implementation into the test assembly and replacing Hosting-internal runtime dependencies with public-compatible behavior.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Restore BrowserLogs health report publishing
Add a public CustomResourceSnapshot helper for publishing health reports without InternalsVisibleTo and use it to restore BrowserLogs session and last-error health report rows.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Address BrowserLogs localization feedback
Add translator comments for BrowserLogs resource strings with format placeholders and regenerate XLF files.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix review findings in BrowserLogs
- Fix null-forgiveness on screenshot Data property to throw
InvalidOperationException instead of ArgumentNullException
- Guard _stopCts.Cancel() against ObjectDisposedException when
MonitorAsync cleanup races with StopAsync
- Block '..' path traversal in SanitizePathSegment
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: David Fowler <davidfowl@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Mitch Denny <mitch@mitchdenny.com>
* [release/13.3] Gateway TLS without hostname (FQDN discovery) + TS AppHost endpoint fix (#16585)
* Support Gateway TLS without pre-known hostname (FQDN discovery)
When WithTls() is called without WithHostname(), the Gateway now:
1. Generates an HTTPS listener without a hostname restriction
2. After Helm deploy, polls Gateway status for the assigned address
3. Patches the HTTPS listener to add the discovered hostname
4. Creates a bootstrap self-signed TLS secret with the discovered FQDN
5. cert-manager then detects the hostname and issues a real certificate
This enables a single-deploy TLS workflow for controllers like AGC that
assign FQDNs automatically (e.g., *.alb.azure.com), without requiring
users to deploy once to discover the FQDN and then redeploy with it.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Use helm field-manager for Gateway hostname patch to avoid conflicts
After patching the Gateway hostname via JSON patch, re-apply the full
Gateway YAML with --server-side --field-manager=helm --force-conflicts
to transfer field ownership back to Helm. This prevents SSA conflicts
when the user later redeploys with an explicit hostname via WithHostname().
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix endpoint resource lookup for TS AppHost RPC bridge
Use ResourceNameComparer on the deploymentTargets dictionary so that
endpoint references created through the TypeScript AppHost RPC bridge
(which may use a different resource instance) resolve correctly by
resource name. This matches the pattern already used in
KubernetesEnvironmentContext._kubernetesComponents.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix test assertion for YAML quoted protocol values
The YAML serializer quotes string values like protocol: "HTTPS" on CI.
Use a more flexible assertion that matches both quoted and unquoted forms.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Address all automated review feedback
1. Address type validation: Parse full Gateway JSON status, prefer
Hostname-type addresses, fall back to DNS-like values, skip IPs.
2. Use -o json instead of jsonpath: Parse full Gateway JSON for both
address discovery and listener index detection. More reliable.
3. Use JsonSerializer + --patch-file: Build JSON patch operations with
proper serialization, write to temp file to avoid shell escaping.
4. Minimal manifest for field ownership: Read current Gateway JSON,
strip server fields (status, resourceVersion, managedFields), keep
only apiVersion/kind/metadata(name,namespace)/spec for SSA apply.
5. Temp file pattern: Use CreateTempSubdirectory consistently.
6. Add SAN to bootstrap certs: Add SubjectAlternativeNameBuilder with
DNS name in both DiscoverFqdnAndBootstrapTlsAsync and the existing
BootstrapTlsSecretsAsync. Modern TLS clients require SAN.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Preserve annotations and labels in Gateway ownership transfer
The minimal manifest used for server-side apply field ownership transfer
was missing annotations and labels, causing AGC annotations like
alb.networking.azure.io/alb-name to be stripped. Now copies annotations
and labels from the current Gateway metadata.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add E2E test for K8S Gateway TLS deployment with HTTP-01
Tests the full flow: provision AKS with ALB controller, install cert-manager
with gatewayHTTPRoute HTTP-01 solver, create a project with AddKubernetesEnvironment
+ AddGateway + WithTls (no hostname), deploy with aspire deploy, and verify
FQDN discovery, certificate issuance, and HTTPS access.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Use --enable-alb in az aks create and AMD VM SKU
Consolidate ALB enablement into the az aks create command instead of a
separate az aks update step. Use Standard_D2as_v5 (AMD) for quota
compatibility with E2E test subscription.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix E2E test: use --enable-gateway-api --enable-application-load-balancer
Per the official AGC quickstart docs, use the correct flags:
- --enable-gateway-api: enables Gateway API CRDs
- --enable-application-load-balancer: enables ALB controller addon
- --network-plugin azure: required Azure CNI
- Standard_D2as_v5: AMD VM SKU for quota compatibility
- Use the add-on's auto-created aks-appgateway subnet instead of
creating one manually
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Wait for ALB controller pods to be Running before checking GatewayClass
The ALB controller pods need time to initialize after cluster creation.
Poll until pods are Running and GatewayClass azure-alb-external exists,
with up to 10 minutes timeout.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix ClusterIssuer: parentRefs requires name and namespace
cert-manager requires parentRefs to include a name. Use 'ingress' to
match the Gateway name from AddGateway('ingress'), and include the
namespace to match the Helm deploy namespace.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix E2E test AppHost: add using directive and pragma suppressions
The injected AppHost code needs:
- using Aspire.Hosting.Kubernetes for AddGateway extension methods
- #pragma warning disable ASPIRECOMPUTE003 for AddContainerRegistry
Both prepended to the top of the file alongside ASPIREPIPELINES001.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix E2E test: capture webfrontend variable from starter template
The starter template generates builder.AddProject('webfrontend') without
assigning to a variable. The Gateway route needs a reference to it, so
inject 'var webfrontend =' before the AddProject call.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Refactor FQDN discovery polling to use Polly retry pipeline
Replace the manual for-loop retry with a Polly ResiliencePipeline
using constant 5s backoff, 60 max attempts, and result-based retry
(retries when result is null). Polly.Core is already a transitive
dependency via Aspire.Hosting.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Mitch Denny <mitch@mitchdenny.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [release/13.3] Fix Python starter TypeScript health check build (#16647)
* Fix Python starter health check template
Update the Python starter TypeScript AppHost to use the supported withHttpHealthCheck options object and align its root build script with AppHost-only type checking. Add E2E coverage that verifies the generated starter builds successfully.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Use fail-fast helper for Python starter build test
Update the Python React template E2E build verification to use the existing fail-fast command helper so npm build failures are surfaced immediately.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Verify TypeScript templates build
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add build script aliases to TypeScript AppHost scaffold
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Use AppHost tsconfig for TypeScript AppHost lint
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Use AppHost tsconfig name for Python starter
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Sebastien Ros <sebastienros@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix sticky 'Finding apphosts' notification in VS Code extension (#16665)
The 'Finding apphosts' message was displayed via DisplayMessage, which
the extension renders as a sticky vscode.window.showInformationMessage
toast that has no programmatic dismissal. Fold it into the surrounding
ShowStatusAsync status text so it rides on the existing progress
notification (auto-dismissed via the finally block) instead.
Co-authored-by: Adam Ratzman <adam@adamratzman.com>
* [release/13.3] API Review Feedback (#16674)
* API Review Feedback
Addressing feedback from https://github.com/microsoft/aspire/pull/16602
Rename JS experimental ID, refactor AKS/EF resource APIs
Renames ASPIREEXTENSION001 to ASPIREJAVASCRIPT001 for JavaScript APIs, resources, and tests. Refactors AKS-related code to Aspire.Hosting.Azure.Kubernetes, makes AksSkuTier internal, and defaults AKS SKU tier to Free. Renames EFMigrationResource.ContextTypeName to DbContextTypeName throughout. Adds missing using directives, Experimental attributes, and AspireValue metadata. Updates tests and samples for new names and diagnostics.
* Remove unused enum
* Change more dbContextTypeName instances.
* Update CodeGeneration snapshots for new WellKnownPipelineSteps entries
Adding [AspireValue("WellKnownPipelineSteps")] to BeforeStart and
CheckContainerRuntime causes the language code generators to emit them
in the WellKnownPipelineSteps exported value catalog. Update the
TwoPassScanningGeneratedAspire snapshots for Go, Java, Python, Rust, and
TypeScript to include the two new entries.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
Co-authored-by: Jose Perez Rodriguez <joperezr@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [release/13.3] Normalize *.localhost dashboard URLs to localhost for CLI HTTP requests (#16708)
* Normalize *.localhost dashboard URLs to localhost for HTTP requests
DNS resolvers typically don't implement RFC 6761 for localhost subdomains,
so hosts like 'myapp.dev.localhost' fail to resolve. This adds
NormalizeDashboardUrl to McpToolHelpers which rewrites *.localhost API
base URLs to localhost before making HTTP requests, while preserving the
original hostname in dashboard display URLs (used in JSON output hyperlinks).
- Add NormalizeDashboardUrl and IsLocalhostTld to McpToolHelpers
- Normalize API base URL in TelemetryCommandHelpers and McpToolHelpers
- Preserve original *.dev.localhost hostname in dashboard display URLs
- Add unit tests for logs/traces with dev.localhost backchannel URLs
- Add E2E test variant using dev.localhost dashboard URL
* Refactor E2E test to use aspire ps --format json for dashboard URL
* Fix E2E test: use --frontend-url and extract dashboard URL from logs
- Use --frontend-url instead of invalid --dashboard-url for aspire dashboard run
- Extract dashboard login URL from log output instead of aspire ps (which
cannot discover standalone dashboards)
- Pass login?t=xxx URL to aspire otel traces for proper token exchange
- dev.localhost variant passes *.localhost to --frontend-url to exercise
NormalizeDashboardUrl end-to-end
* Fix E2E test: extract URL from dashboard run output, use --allow-anonymous
- Add --allow-anonymous to avoid token exchange issues in standalone mode
- Extract dashboard URL from 'Now listening on:' in aspire dashboard run output
- Avoids needing login token exchange which fails in container E2E tests
* Fix E2E test: use auth with login token from dashboard run output
- Remove --allow-anonymous to verify authentication works end-to-end
- Extract login URL (with ?t=xxx token) from aspire dashboard run output
- CLI exchanges login token for API key via validateToken endpoint
* Add echo of OTEL_DASHBOARD_URL for debugging visibility
* Add AppHost otel traces tests with dev.localhost variant
- Add AppHostOtelTracesReturnsTraces and _DevLocalhost variants
- New tests create Starter project, start AppHost, generate traces, verify otel traces output
- DevLocalhost variant uses useDevLocalhost flag in AspireNewAsync to test URL normalization
- Add useDevLocalhost parameter to AspireNewAsync helper
* Fix standalone dashboard tests and add dev.localhost otel logs test
- Fix grep regex to use [a-f0-9]+ for token to avoid Spectre Console link duplication
- Remove AppHost otel traces tests (covered by OtelLogs tests)
- Add OtelLogsReturnsStructuredLogsFromStarterApp_DevLocalhost test
* Use DASHBOARD__FRONTEND__BROWSERTOKEN instead of parsing URL from logs
Spectre Console OSC 8 escape sequences in redirected output cause grep
to capture a doubled URL. Instead, set a known browser token via env var
and construct the dashboard URL directly.
* Fix AspireStartAsync sed pattern to match *.localhost dashboard URLs
The sed pattern for extracting dashboardUrl from JSON only matched
'localhost' literally. With dev.localhost subdomains (e.g.
dashboard.dev.localhost:18888), the pattern failed to match, causing
'aspire start did not return a dashboard URL'. Broadened to [a-z.]*localhost.
* Preserve original *.localhost hostname in display URLs for --dashboard-url path
The --dashboard-url code path was normalizing the URL and using it for
both HTTP requests and JSON output hyperlinks. Now it preserves the
original hostname (e.g. dashboard.dev.localhost) for display URLs while
still normalizing to localhost for HTTP requests, matching the
backchannel path behavior.
Also adds remarks to NormalizeDashboardUrl explaining the RFC 6761 DNS
resolution motivation, and tests for the --dashboard-url display URL
preservation.
* Address review comments: normalize URL in StaticDashboardInfoProvider, fix error messages, fix E2E test
- Normalize apiBaseUrl in StaticDashboardInfoProvider so aspire agent mcp
--dashboard-url with *.dev.localhost URLs works correctly
- Use displayDashboardUrl in error messages so users see the URL they typed
- Fix E2E test to pass frontendUrl to aspire otel traces, actually exercising
the NormalizeDashboardUrl code path end-to-end
* Add test asserting error messages show original *.dev.localhost URL
* Add E2E tests for aspire agent mcp list_structured_logs
* Rename DashboardOtelTracesTests to DashboardRunTests and add agent mcp tests
- Rename class and file to DashboardRunTests
- Add E2E tests for aspire agent mcp --dashboard-url against standalone dashboard
- Extract CallAgentMcpToolAsync helper to CliE2EAutomatorHelpers
- Use shared helper in AgentMcpLogsTests
* [release/13.3] Fix aspire init template install for non-stable CLI builds (#16654) (#16672)
* [release/13.3] Fix aspire init template install for non-stable CLI builds (#16654)
�spire init ran `dotnet new install Aspire.ProjectTemplates@<cliVersion+sha>`
with `nugetConfigFile: null` and `nugetSource: null`, bypassing the channel
feed wiring used by `aspire new`. For non-stable CLI builds (staging/daily/PR),
`Aspire.ProjectTemplates@<cliVersion+sha>` is only available on a per-commit
darc feed (e.g. `darc-pub-microsoft-aspire-<sha8>`), so install failed with
exit code 103 in any C# repo containing a `.sln`.
Extract the channel-aware template package resolution and install logic out of
`DotNetTemplateFactory.ApplyTemplateAsync` and into `TemplateNuGetConfigService`
as `ResolveTemplatePackageAsync` and `InstallTemplatePackageAsync`. Both
`DotNetTemplateFactory` and `InitCommand` now consume the helper. The
existing `aspire new` install path is preserved bit-for-bit (extraction is
mechanical; `IncludePrHives: true` keeps PR-hive widening behavior).
For `aspire init` this means:
- The version sent to `dotnet new install` is now the channel-resolved one
(e.g. `13.3.0`), not the raw `+sha` build metadata.
- Init now honors the global `channel` configuration, matching `aspire new`.
- On install failure, captured stdout/stderr is displayed before the error.
- `ChannelNotFoundException` and `EmptyChoicesException` produce friendly
errors instead of bubbling to the top-level "unexpected error" handler.
- PR hives are intentionally NOT included in init's channel discovery so a
developer with stale `~/.aspire/hives/*` doesn't get a different template
than they'd get on a clean machine.
Notes:
- `TemplateNuGetConfigService` is a singleton; `IDotNetCliRunner` is
transient and is therefore passed as a method parameter to
`InstallTemplatePackageAsync` instead of being injected.
- New regression tests cover: explicit channel passes the temp NuGet config,
implicit channel leaves it null, PR hives don't widen init, and channel
resolution failures produce friendly errors.
Fixes #16654
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Address PR review feedback (#16672)
Multi-model code review caught the following issues:
1. Restore original order of operations in DotNetTemplateFactory.ApplyTemplateAsync.
The first refactor moved extraArgsCallback ahead of template package resolution,
which changed prompt/error precedence for `aspire new` (extra-args prompts
like Redis-cache, test-framework, xUnit-version would now run before channel
lookup, and answers would be discarded if resolution failed afterward).
Restored the BEFORE order from release/13.3: ResolveTemplatePackageAsync
first, then extraArgsCallback, then InstallTemplatePackageAsync. Updated the
in-source comment to be accurate.
2. Catch NuGetPackageCacheException in InitCommand.DropCSharpProjectSkeletonAsync.
The pre-extraction init code went straight to `dotnet new install` and
never invoked a NuGet search, so feed search failures (offline, inaccessible
feed, etc.) couldn't bubble up. After the extraction init now performs the
search and was missing the catch, surfacing the failure as an unhandled
"unexpected error". Added the catch with the same friendly-error treatment
as ChannelNotFoundException / EmptyChoicesException.
3. Use TemplatingStrings.TemplateInstallationFailed in InitCommand for parity
with `aspire new`. The previous ad-hoc string omitted the log file path,
making post-mortem diagnosis harder.
4. Added a comment in InstallTemplatePackageAsync clarifying that the temporary
NuGet config is intentionally disposed at the end of the install (only
`dotnet new install` consumes it; the subsequent `dotnet new <template>`
call uses the already-installed template hive and ambient NuGet config).
5. Added regression test InitCommand_WhenChannelTemplateSearchFails_DisplaysFriendlyError
covering the new NuGetPackageCacheException catch.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Make AtsJsonCodeWriter shared internal helper (#16752)
Move the JSON code writer out of Aspire.TypeSystem so it is not exposed as public API. Link the shared internal helper into each CLI and code generation project that uses it.
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [release/13.3] Validate TypeScript AppHosts before startup (#16755)
* Validate TypeScript AppHost before start
Add a pre-execute runtime hook and use it to run TypeScript type validation before starting or publishing TypeScript AppHosts. Watch mode validates on every restart so startup is not blocked by existing errors while editing.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Address TypeScript AppHost review feedback
Clarify the PreExecute contract and make Bun typecheck/watch commands use project-local binaries via bun run instead of bun x.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix TypeScript AppHost E2E type checks
Use Yarn run for project-local TypeScript tools so arguments are forwarded correctly, and update the TypeScript publish E2E fixture to use the typed dashboard options shape.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix Kubernetes TypeScript E2E type check
Update the Kubernetes TypeScript deploy E2E fixture to use the generated withHelm options shape so it passes runtime type validation.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Use project-local Bun nodemon in watch
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Sebastien Ros <sebastienros@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update dependencies from https://github.com/microsoft/dcp build 0.23.4 On relative base path root Microsoft.DeveloperControlPlane.darwin-amd64 , Microsoft.DeveloperControlPlane.darwin-arm64 , Microsoft.DeveloperControlPlane.linux-amd64 , Microsoft.DeveloperControlPlane.linux-arm64 , Microsoft.DeveloperControlPlane.linux-musl-amd64 , Microsoft.DeveloperControlPlane.windows-amd64 , Microsoft.DeveloperControlPlane.windows-arm64 From Version 0.23.3 -> To Version 0.23.4 (#16757)
Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
* [release/13.3] Fix HostUrl with container tunnel (#16786)
* Fix HostUrl with container tunnel
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Scope HostUrl matching to host endpoints
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: David Negstad <David.Negstad@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [release/13.3] Avoid AppHost discovery when config path is valid (#16680)
* Avoid AppHost discovery when config path is valid
Validate configured AppHost paths before using them and skip recursive discovery for normal CLI resolution when the configured path is already a valid AppHost. Preserve candidate listing behavior so extension commands can still enumerate all AppHost candidates.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Restore silent: true for fast-path settings lookup
Reverts an unintended verbosity change so users with a stale legacy
.aspire/settings.json don't see a 'AppHost was specified but doesn't
exist' warning on every aspire run when the CLI is going to fall
back to discovery anyway.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add ProjectLocator tests for fast-path coverage requested in review
- Add Throw-mode variant of UseOrFindAppHostProjectFileUsesValidSettingsWithoutScanning
to prove recursive discovery is also skipped for non-interactive/JSON callers.
- Add fast-path test with a configured guest AppHost (apphost.ts) and a throwing
language discovery to cover the production guest-AppHost scenario from the issue.
- Add a parameterized fallback test that verifies an existing-but-invalid configured
AppHost (IsUnsupported / IsPossiblyUnbuildable) falls back to discovery.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: adamint <adamratzman1@gmail.com>
* [release/13.3] Reject Yarn Classic for TypeScript AppHosts (#16792)
* Reject Yarn Classic for TypeScript AppHosts
Yarn Classic is not supported for TypeScript AppHosts because its command behavior differs from supported package managers and can break Aspire argument forwarding.
Detect Yarn Classic through packageManager declarations and Yarn v1 lockfiles, then fail early with guidance to use Yarn 4 or later, npm, pnpm, or Bun.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update yarn tests to v4
* Update tes dockerfiles
---------
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [release/13.3] Fix dashboard error in .NET 11 preview 4 (#16761)
* Run dashboard in .NET 11
* Update
* Update
* Fix Aspire new empty AppHost language picker (#16666) (#16776)
* Fix Aspire new empty AppHost language picker
Keep a single interactive Empty AppHost template entry while retaining direct language-specific subcommands for non-interactive creation. Filter the language picker by enabled AppHost languages and add missing Python/Rust shortcut template IDs. Update NewCommand tests and E2E helper selection for the new flow.
* Address empty AppHost prompt review feedback
* Include hidden templates in non-interactive suggestions
* Stop persisting new command language selection
* Allow language option on new subcommands
---------
(cherry picked from commit 8bd4b60535047220a6b396e99ad16f25036b39ce)
Co-authored-by: Maddy Montaquila (Leger) <maddyleger1@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [release/13.3] Fix Python debug working directory in VS Code (#16575) (#16779)
* Fix Python debug working directory in VS Code (#16575)
When a Python app runs under the VS Code Aspire extension's debugger, os.getcwd() returned the AppHost directory instead of the Python app directory, and .WithWorkingDirectory(...) only updated the dashboard without affecting the actual debug cwd.
Add a working_directory field to PythonLaunchConfiguration that flows through DCP to the VS Code extension, where it now sets debugConfiguration.cwd. Path computation is moved inside the WithDebugSupport annotator lambda so a later .WithWorkingDirectory(...) override is respected at debug time.
Also drops the previous Module-entrypoint hack that smuggled the working directory through program_path.
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Address Copilot review feedback for Python debug working directory
- Keep ProgramPath populated with the working directory for non-Script
(Module + Executable) entrypoints to preserve backward compatibility
with older VS Code extensions that derive cwd from program_path and
don't yet understand the new working_directory field.
- Update the comment to mention both Module and Executable entrypoints.
- Update the existing module test to reflect the kept ProgramPath value.
- Add Executable-entrypoint coverage: one test asserting working_directory
flows through and another asserting WithWorkingDirectory overrides are
respected on the launch configuration.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Adam Ratzman <adam@adamratzman.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Adam Ratzman <adamratzman1@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix notification action closure over scoped services (#16763)
* [release/13.3] Fix Foundry hosted agent endpoint resolution (#16809)
* Fix hosted agent endpoint resolution
Resolve hosted-agent environment endpoint references through compute environment deployment expressions during publish so aspire deploy does not wait on endpoint allocation snapshots. Throw for unsupported internal referenced endpoints and add regression coverage for direct and nested endpoint expressions.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Address hosted agent review comments
Fix endpoint resolution diagnostics, reuse the shared formatting helper, keep upgraded endpoint TLS values consistent with the effective scheme, and document endpoint property resolution behavior.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Refine endpoint property documentation
Clarify that compute environment endpoint property expressions are generally useful whenever callers need environment-specific reference expressions, not only for deployment publishers.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Require --yes with --non-interactive for destroy cmd (#16806)
Added validation to enforce --yes when --non-interactive is used with the destroy command, returning a localized error if omitted. Introduced a new NonInteractiveRequiresYes resource and updated all localization files. Expanded DestroyCommandTests to cover new validation, multiple CLI permutations, and error scenarios for failed destroy activities.
Fix #16623
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
* Consolidate Helm chart options on WithHelm(...) (#16759) (#16802)
* Drop nuget.config alongside single-file apphost.cs in `aspire init` (#16636) (#16822)
* chore: whitespace change to trigger deployment test repro
* Drop nuget.config alongside single-file apphost.cs in `aspire init`
Deployment E2E tests on main were failing 12 of 13 with:
Unhandled exception: The SDK 'Aspire.AppHost.Sdk/<v>' specified
could not be found. /tmp/.../apphost.csproj
The package installation failed with exit code 5.
After PR #15918 redesigned `aspire init` to drop a single-file
`apphost.cs` (with `#:sdk Aspire.AppHost.Sdk@<version>`) and an
`aspire.config.json` instead of a full `.csproj` project, the
generated workspace contains no `nuget.config`. The local hive
(where the dev SDK lives, e.g. `~/.aspire/hives/local/packages`)
is therefore invisible to MSBuild, so the SDK directive cannot be
resolved.
Any subsequent operation that triggers MSBuild restore fails:
* `aspire add <pkg>` (which runs `dotnet package add --file
apphost.cs`) — this is the failure mode the deployment E2E tests
hit.
* `dotnet run --file apphost.cs`
* `aspire start`
Fix: when `aspire init` drops the single-file C# skeleton, also
drop a workspace-local `nuget.config` listing every local hive
under `~/.aspire/hives/<name>/packages` as a NuGet package source.
We don't add package source mapping restrictions, so transitive
dependencies still resolve from inherited sources (typically
nuget.org) via the normal NuGet source hierarchy. Behavior for
users without any local hive is unchanged (no `nuget.config` is
written).
* Use shared TemplateNuGetConfigService for init nuget.config
Address PR review feedback (davidfowl, radical) by replacing the inline
ad-hoc nuget.config creation in InitCommand with a call to the shared
TemplateNuGetConfigService — the same path used by 'aspire new' for
template output.
This delegates to NuGetConfigMerger, which:
* Resolves the user's configured channel (from 'aspire config get channel'),
so it works for any non-stable hive — local-*, dev-*, pr-*, run-*,
staging — not just channels named 'local'.
* Creates a new nuget.config or merges missing sources into an existing
one, so additional hives added later (e.g. via subsequent aspire
commands) are handled the same way they are for templates.
* No-ops for stable/implicit channels, matching prior behavior of doing
nothing for the default user case.
* Add silent CreateOrUpdateNuGetConfigWithoutPromptAsync overload
The previous refactor used PromptToCreateOrUpdateNuGetConfigAsync, which
in the in-place case (workingDir == outputPath, the case for aspire init)
prompts the user with 'Create NuGet.config for selected channels?'. The
existing E2E and unit tests for aspire init don't expect any prompt, so
they hung waiting for the next expected text.
Add a new public method CreateOrUpdateNuGetConfigWithoutPromptAsync that
always uses the silent merge path, and switch InitCommand to call it.
This keeps the same shared NuGetConfigMerger create-or-merge semantics
without changing the interactive UX of aspire init.
Also register TemplateNuGetConfigService in the test DI container so
InitCommand can resolve it from CliTestHelper.
* Avoid 'NuGet.config' substring in init's confirmation message
The AspireInitAsync E2E test helper detects the NuGet.config Y/n prompt
by looking for the literal substring 'NuGet.config' on screen. The shared
NuGetConfigPrompter (used in the silent path) emits a confirmation message
that also contains 'NuGet.config', causing the helper to false-match the
message as a prompt and get out of sync with subsequent prompts (most
notably the agent-init Y/n).
Fix: in TemplateNuGetConfigService.CreateOrUpdateNuGetConfigWithoutPromptAsync,
bypass NuGetConfigPrompter and call NuGetConfigMerger directly so no
built-in confirmation message is emitted. Return a bool indicating whether
a config was written, and let InitCommand emit a neutral message
('Created package sources file') that does not contain the trigger
substring.
* Quarantine flaky StopNonInteractiveTests E2E tests
Three consecutive PR CI reruns failed with different transient timeouts in:
- StopNonInteractiveMultipleAppHostsShowsError (3m timeout on 'AppHost started successfully')
- StopAllAppHostsFromUnrelatedDirectory (8m20s timeout on success prompt)
Both go through 'aspire new' + 'aspire start' (unrelated to the init/nuget.config changes in this PR). Tracking issue: #16643.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [release/13.3] Honor configured channel in 'aspire update' (#16808)
* Honor configured channel in 'aspire update'
'aspire update' previously consulted only the explicit --channel/--quality
option and otherwise silently selected the implicit channel (or prompted only
if PR hives were present). The local and global 'channel' configuration values
were never read, so a user who ran 'aspire config set channel staging' (or had
it saved by 'aspire update --self') would still get the implicit/NuGet-config
based channel on subsequent 'aspire update' runs.
UpdateCommand.ExecuteAsync now resolves the channel using the documented
precedence:
1. explicit --channel / hidden --quality
2. local app config 'channel' (aspire.config.json / .aspire/settings.json)
3. global config 'channel' (~/.aspire/settings.global.json)
4. interactive channel prompt when PR hives are present
5. implicit/default channel as the documented fallback
Local-vs-global precedence comes for free because RegisterSettingsFiles loads
the global settings file before the local one, so IConfiguration (and
IConfigurationService.GetConfigurationAsync) returns the local value when both
exist. A configured channel that does not match any available channel now
surfaces a ChannelNotFoundException instead of being silently ignored.
The existing UpdateCommand_WithoutHives_UsesImplicitChannelWithoutPrompting
test is preserved (no configured channel still falls back to the implicit
channel) and joined by new regression coverage:
* UpdateCommand_LocalConfiguredChannel_IsUsed
* UpdateCommand_GlobalConfiguredChannel_IsUsed
* UpdateCommand_ExplicitChannelOverridesConfiguredChannel
* UpdateCommand_LocalConfiguredChannel_OverridesGlobalConfiguredChannel
* UpdateCommand_WithoutHives_ConfiguredChannel_TakesPrecedenceOverImplicitFallback
* UpdateCommand_ConfiguredChannelNotInChannelList_ThrowsChannelNotFound
Fixes #16650
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Resolve `aspire update` channel config relative to AppHost project directory
Addresses Copilot reviewer feedback on PR #16716. The previous fix moved
channel resolution to read from `IConfiguration`, but `IConfiguration` is
rooted at `Environment.CurrentDirectory` at startup via
`ConfigurationHelper.RegisterSettingsFiles`. That means
`aspire update --apphost <path-to-other-app>/AppHost.csproj` ignored the
target app's local `aspire.config.json` and read config from the caller's
cwd tree instead, so the documented "local app-config in the project tree"
precedence was still broken for explicit `--apphost` updates.
Add `IConfigurationService.GetConfigurationFromDirectoryAsync(key, startDirectory)`
which walks up from a caller-supplied directory for the nearest
`aspire.config.json`, then falls back to the global settings file. The
process-wide IConfiguration is intentionally not consulted, so the lookup
is never anchored to the launch cwd.
`UpdateCommand` now passes `projectFile.Directory` to scope the channel
lookup to the resolved AppHost project's tree.
Three new tests cover:
- Project in another directory uses its own local config
- Project-local config wins over cwd config
- Project-local config without `channel` falls back to global
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Mitch Denny <mitch@mitchdenny.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [release/13.3] Use plain dotnet run for extension Run Without Debugging (#16803)
* Use plain dotnet run for extension Run Without Debugging
* Honor IDE-advertised SupportedLaunchConfigurations for project resources
ExtensionUtils.SupportsDebugging treated 'project' launch type as implicitly supported by every IDE, even when the IDE explicitly advertised a SupportedLaunchConfigurations list that did not include 'project'.
This caused project resources to fail to start in VS Code when the C# extension was not installed: the AppHost routed them to the extension via DCP, and the extension returned 400 UnsupportedLaunchConfiguration because it has no project debugger registered without C#.
Now the implicit-project rule only applies when the IDE did not send DEBUG_SESSION_INFO at all (the Visual Studio scenario). When the IDE sent an explicit list, honor it for every launch type including 'project' — IDEs that can launch project resources must advertise 'project' in their list. The VS Code extension already does this correctly when C# is installed.
Resources whose launch type is not in the advertised list now fall to ExecutionType.Process, so the AppHost spawns dotnet itself and the resource starts (without a debugger attached, which is correct since the IDE has no debugger to attach).
* Remove NoExtensionLaunch flag
DotNetAppHostProject only needed NoExtensionLaunch to prevent the
extension from launching the apphost during pipeline (publish/exec)
flows. Since the extension launch path now uses plain 'dotnet run' for
Run Without Debugging, the flag is unused — pipeline commands already
take a different code path.
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Adam Ratzman <adam@adamratzman.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Backport CLI AppHost debug console output fixes (#16795) (#16816)
Backports the CLI portions of #16795 to release/13.3.
Includes AppHost summary formatting for extension-host output, serialized extension interaction output, and guest AppHost pre-launch failure surfacing.
* Fix #15986: emit apphost.run.json from aspire init single-file skeleton (#16812) (#16821)
* Add CLI E2E repro for #15986: dotnet run apphost.cs after aspire init
Demonstrates that 'dotnet run apphost.cs' against the single-file C#
AppHost dropped by interactive 'aspire init' fails because the launch
profile env vars (ASPNETCORE_URLS, ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL,
ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL) are missing — aspire init does not
write apphost.run.json and the .NET file-based runner only honours that
file (not aspire.config.json) for launch profiles.
This commit intentionally adds a failing test; the fix follows in a
subsequent commit on the same PR.
* Fix #15986: emit apphost.run.json from aspire init single-file skeleton
After 'aspire init' drops the C# single-file AppHost ('apphost.cs' +
'aspire.config.json' + 'NuGet.config'), running 'dotnet run apphost.cs'
crashed at startup because no launch profile was applied:
Failed to configure dashboard resource because ASPNETCORE_URLS
environment variable was not set.
Failed to configure dashboard resource because
ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL and
ASPIRE_DASHBOARD_OTLP_HTTP_ENDPOINT_URL are not set.
The dashboard / OTLP / resource service env vars normally come from a
launch profile. When the AppHost is launched via 'aspire run' the CLI
injects them from 'aspire.config.json'. When launched via the .NET
file-based runner ('dotnet run apphost.cs') only '<file>.run.json'
(here 'apphost.run.json') is honoured, and the init flow was not
producing it.
Fix: in InitCommand.DropCSharpSingleFileSkeletonAsync, generate the
profile ports once and pass them into both the existing
'aspire.config.json' writer and a new 'apphost.run.json' writer so the
two files agree on the dashboard URLs. The 'apphost.run.json' shape
mirrors the existing aspire-apphost-singlefile MSBuild template
(commandName=Project, dotnetRunMessages=true, launchBrowser=true,
ASPNETCORE_ENVIRONMENT/DOTNET_ENVIRONMENT=Development, dashboard /
OTLP / resource service URLs).
The aspire-apphost-singlefile MSBuild template is unaffected since it
already ships 'apphost.run.json' alongside its other artifacts. No
other call site of DropAspireConfig is changed (the new ports parameter
is optional and defaults to the previous self-generation behaviour).
Adds InitCommand_SingleFileSkeleton_CreatesAppHostRunJsonWithDashboardEnvVars
unit test and updates the SingleFileAppHostInitDotnetRunTests E2E
repro added in the previous commit.
Fixes #15986
* Add CLI E2E test for #15986: aspire init then dotnet run apphost.cs
Drives the user-facing flow that #15986 broke:
1. `aspire init` (interactive, default C# selection).
2. Inspect the bind-mounted workspace from the host: assert
`apphost.cs`, `aspire.config.json`, and `apphost.run.json` all
exist, and that `apphost.run.json`'s `https` profile carries the
dashboard / OTLP / resource-service env vars (full schema is covered by
`InitCommand_SingleFileSkeleton_CreatesAppHostRunJsonWithDashboardEnvVars`).
3. `dotnet run apphost.cs` and wait for
`Distributed application started.`.
4. Ctrl+C and exit cleanly.
Before the fix, `apphost.run.json` was never written, the precondition
in step 2 fails fast with an explicit pointer to #15986, and step 3
would crash at startup with the dashboard `OptionsValidationException`
about missing `ASPNETCORE_URLS` / `ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL`
(verified on this branch — the test-only commit pushed earlier failed in
CI with exactly that error before the fix landed in this PR).
* Trigger CI revalidation (whitespace only)
* Address PR feedback: shared JSON options + ports always agree
James review feedback on #16812:
1. Use shared JsonSourceGenerationContext.RelaxedEscaping (which already has WriteIndented = true and UnsafeRelaxedJsonEscaping) instead of inline 'new JsonSerializerOptions { WriteIndented = true }' at both ToJsonString call sites in InitCommand.
2. Make divergence between aspire.config.json and apphost.run.json impossible by construction. DropAspireConfig now returns the effective ports (newly generated, or read back from a pre-existing profiles section), and DropCSharpSingleFileSkeletonAsync threads those into DropAppHostRunJson — so even if aspire.config.json was hand-edited or pre-existed, both files always describe the same dashboard / OTLP / resource service endpoints.
Added unit test InitCommand_SingleFileSkeleton_AppHostRunJsonAdoptsPortsFromExistingAspireConfig that pre-seeds aspire.config.json with profiles and asserts apphost.run.json adopts those exact ports.
Also dropped the E2E 'Distributed application started.' wait timeout from 7 minutes to 1 minute — even a cold dotnet build of the bare single-file AppHost completes well inside that budget; if it's not started by then, fail fast.
* Strengthen inline comments at JSON literals (PR #16812 review nits)
James left two nit comments asking for short explanatory comments at the JSON literal blocks. Beef up the comment at the apphost.run.json literal in DropAppHostRunJson explaining what shape it mirrors and why; the existing comment in DropAspireConfig now also calls out that each profile carries the dashboard URL plus the OTLP / resource-service env vars consumed by DashboardOptionsValidator at AppHost startup.
* Address PR feedback: preserve user profiles + use KnownConfigNames
Two more JamesNK review comments on PR #16812:
1. Behavioural regression (line 481): the previous patch overwrote any pre-existing 'profiles' section in aspire.config.json whenever TryReadAppHostProfilePorts couldn't parse all six expected ports (e.g. user-customised config, https-only setup, missing one of the env vars). The original implementation preserved existing profiles unconditionally — this is restoring that safety. New behaviour:
- profiles is null -> write fresh, return those ports
- profiles parses cleanly -> adopt those ports, return them (existing behaviour)
- profiles exists but doesn't match the expected shape -> PRESERVE the user's profiles untouched, generate fresh ports just for apphost.run.json (accepted edge-case divergence — better than silent data loss)
Added InitCommand_SingleFileSkeleton_PreservesUnparseableExistingProfiles to lock the preservation behaviour in.
2. Use KnownConfigNames constants (line 546): replaced literal 'ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL', 'ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL', 'ASPIRE_ALLOW_UNSECURED_TRANSPORT' strings throughout InitCommand.cs (in DropAspireConfig, DropAppHostRunJson, and TryReadAppHostProfilePorts) with KnownConfigNames.DashboardOtlpGrpcEndpointUrl / .ResourceServiceEndpointUrl / .AllowUnsecuredTransport. Test fixtures keep literal strings since they document the on-disk JSON shape from the user's perspective.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Bump patch version from 13.3.0 to 13.3.1 (#16951)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: joperezr <13854455+joperezr@users.noreply.github.com>
* [create-pull-request] automated change (#16602)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update dependencies from https://github.com/microsoft/dcp build 0.23.5 On relative base path root Microsoft.DeveloperControlPlane.darwin-amd64 , Microsoft.DeveloperControlPlane.darwin-arm64 , Microsoft.DeveloperControlPlane.linux-amd64 , Microsoft.DeveloperControlPlane.linux-arm64 , Microsoft.DeveloperControlPlane.linux-musl-amd64 , Microsoft.DeveloperControlPlane.windows-amd64 , Microsoft.DeveloperControlPlane.windows-arm64 From Version 0.23.4 -> To Version 0.23.5 (#16944)
Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
* [release/13.3] Skip compute env validation in run mode (#16940) (#16952)
* Skip Azure compute env validation in run mode (#16940)
The validate-azure-container-apps and validate-azure-app-service pipeline
steps run in 'before-start', which fires for both 'aspire run' and publish.
In run mode, AddAzureContainerAppEnvironment/AddAzureAppServiceEnvironment
do not add their environment resources to the model. Any compute resource
that ends up with a PublishAs* customization annotation (for example via
WithAnnotation) therefore trips the 'no environment resources' branch at
'aspire run' time, even though the user did add an environment.
PublishAs* annotations only affect publish/deploy output, so skip the
validation entirely when ExecutionContext.IsPublishMode is false.
Fixes #16940.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix Docker and K8s too
---------
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Backport of https://github.com/microsoft/aspire/pull/16988 into release/13.3 (#16993)
* Fix WaitFor() for tunnel-dependent containers
# Conflicts:
# src/Aspire.Hosting/Dcp/ContainerCreator.cs
# src/Aspire.Hosting/Dcp/DcpExecutor.cs
# tests/Aspire.Hosting.Tests/Dcp/TestKubernetesService.cs
* Fix code review issues
* Do not dispose externally-provided ContainerCreator instance
* Add application cancellation token for container tunnel creation
* Improve error reporting for container tunnel (#16537)
* Improve error reporting for container tunnel
Fixes https://github.…
Backport of #16759 to release/13.3
/cc Mitch Denny (@mitchdenny) Eric Erhardt (@eerhardt)
Description
Consolidates the Helm chart configuration surface on
KubernetesEnvironmentResourceonto the existingWithHelm(...)extension, addressing API-review feedback on PR #16602.Adds
WithChartName(...)andWithChartDescription(...)overloads toHelmChartOptions(mirroring existingWithChartVersion), and internalizes theHelmChartName/HelmChartVersion/HelmChartDescriptionproperties onKubernetesEnvironmentResourcesoWithHelmis the single configuration entry point. Also fixes a latent bug where the deploy-time rewrite ofChart.yamlonly updatedversionbut notappVersionwhen the chart version was parameter-backed.Customer Impact
Customers using
KubernetesEnvironmentResourceget a single, consistent API for configuring Helm chart name, version, and description. Without this change, customers would continue to have two parallel APIs (annotation-basedWithHelmand property-basedWithProperties) for what should be the same configuration, and parameter-backed chart versions would only updateversion(notappVersion) in the generatedChart.yaml.Testing
tests/PolyglotAppHosts/Aspire.Hosting.Kubernetes/Go/apphost.go— the Go polyglot Kubernetes apphost does not exist inrelease/13.3(it was added later), so the deletion was honored.Aspire.Hosting.Kubernetes.Testslocally on Windows: 0 warnings, 0 errors.Aspire.Hosting.Kubernetes.Testslocally: 146/146 passing.Risk
Low. The change is scoped to
Aspire.Hosting.Kubernetesand tightens the public API surface (internalizes a few properties, adds newWithChart*overloads). The deploy-timeChart.yamlrewrite removal is safe becauseaspire deployalways runs publish first (--operation publish --step deploy), so publish now writes the correctChart.yamlon the first pass.Regression?
No