Skip to content

Merge release/13.2 into main#14979

Merged
radical merged 34 commits intomainfrom
backmerge
Mar 7, 2026
Merged

Merge release/13.2 into main#14979
radical merged 34 commits intomainfrom
backmerge

Conversation

@radical
Copy link
Member

@radical radical commented Mar 5, 2026

Summary

Backmerge origin/release/13.2 into main.

This PR started as a partial backmerge. It has now been updated by merging the current tip of origin/release/13.2 into this branch, with conflicts resolved in favor of release/13.2 where appropriate.

Conflicts resolved in this update

File(s) Resolution
tests/Aspire.Cli.EndToEnd.Tests/BannerTests.cs Took the release/13.2 version, including the Hex1bTerminalAutomator flow and the existing [ActiveIssue("https://github.com/dotnet/aspire/issues/14307")] on Banner_NotDisplayedWithNoLogoFlag.
src/Aspire.Hosting/Resources/xlf/InteractionStrings.{cs,de,es,fr,it,ja,ko,pl,pt-BR,ru,tr,zh-Hans,zh-Hant}.xlf Took the release/13.2 translations so they match the updated ParametersInputsRememberDescriptionNotConfigured source text.

Previously documented conflict resolutions

File(s) Resolution
eng/Versions.props Auto-resolved (rerere)
AspireCliTelemetry.cs Kept both sides — main's using Aspire.Hosting + release/13.2's OS telemetry and version helpers
AtsMarshaller.cs Took release/13.2 — adds ReferenceHandler.IgnoreCycles, TypeInfoResolver, ApplyDtoProperties
AtsMarshallerTests.cs Took release/13.2 — superset including additional DTO test types
CapabilityDispatcherTests.cs Combined — main's enum tests + release/13.2's builder-to-resource tests
ResourceCommandStrings XLF (13 files) Took release/13.2 — entries removed by command rename
StopCommandStrings XLF (13 files) Took release/13.2 — simplified description

Validation

  • ./restore.sh
  • dotnet build src/Aspire.Hosting/Aspire.Hosting.csproj /p:SkipNativeBuild=true
  • dotnet build tests/Aspire.Cli.EndToEnd.Tests/Aspire.Cli.EndToEnd.Tests.csproj /p:SkipNativeBuild=true

Fixes #14976

cc @adamint @JamesNK @IEvangelist @karolz-ms @davidfowl

adamint and others added 30 commits March 3, 2026 16:59
* Add Getting Started walkthrough to VS Code extension

* Update extension/walkthrough/dashboard.md

Co-authored-by: Maddy Montaquila (Leger) <maddyleger1@gmail.com>

---------

Co-authored-by: Maddy Montaquila (Leger) <maddyleger1@gmail.com>
* Add AspireExport coverage for Azure Redis

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

* Update playground/polyglot/TypeScript/Aspire.Hosting.Azure.Redis/ValidationAppHost/tsconfig.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add polyglot exports for Aspire.Hosting.Garnet

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

* Refine AspireExport descriptions for polyglot-garnet

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Enhance DTO handling in callback proxies: implement writeback for modified DTOs and support circular references in serialization

* Enhance DTO writeback handling: improve support for circular references and ensure non-DTO args are safely ignored during writeback

* Enhance DTO property handling: respect JsonPropertyName and JsonIgnore attributes, and skip read-only properties during writeback
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add polyglot exports for Aspire.Hosting.GitHub.Models

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

* Update src/Aspire.Hosting.GitHub.Models/GitHubModelsExtensions.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/Aspire.Hosting.GitHub.Models/GitHubModelsExtensions.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Refine AspireExport descriptions for polyglot-github-models

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

* Update playground/polyglot/TypeScript/Aspire.Hosting.GitHub.Models/ValidationAppHost/apphost.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Add polyglot exports for Aspire.Hosting.Qdrant

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

* Refine AspireExport descriptions for polyglot-qdrant

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
#14915)

The Sigstore and Tuf NuGet packages (and their transitive dependency
NSec.Cryptography) were added to Aspire.Cli in #14569 but the
corresponding FileSignInfo entries in eng/Signing.props were not added.
This causes SIGN004 errors in the internal build because the Arcade SDK
detects 3rd-party DLLs being signed with the Microsoft certificate.

Add FileSignInfo entries with CertificateName="3PartySHA2" for:
- NSec.Cryptography.dll (transitive dep, © Klaus Hartke)
- Sigstore.dll (direct dep)
- Tuf.dll (direct dep)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Restructure CLI resource commands under 'aspire resource'

* Detect bare-word args in 'aspire start' and guide users to 'aspire resource'

* Remove TreatUnmatchedTokensAsErrors=false from StartCommand

* Add tests that 'aspire start/stop myresource' fail

* Restore unmatched token forwarding in StartCommand and add forwarding tests

* Move StartDescription to StartCommandStrings
* Add polyglot exports for Aspire.Hosting.Yarp

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

* Refine AspireExport descriptions for polyglot-yarp

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

* Use generated methods in yarp apphost

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

* Expand yarp apphost generated method coverage

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

* Expose Yarp transform methods to polyglot apphost

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add polyglot exports for Aspire.Hosting.OpenAI

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

* Refine AspireExport descriptions for polyglot-openai

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

* Use generated methods in openai apphost

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add polyglot exports for Aspire.Hosting.Azure.SignalR

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

* Refine AspireExport descriptions for polyglot-azure-signalr

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

* Remove polyglot app hosts remark from AddAzureSignalR

Removed remark about overload availability in polyglot app hosts.

* Remove polyglot app hosts remark from documentation

Removed remark about overload availability in polyglot app hosts.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add polyglot exports for Aspire.Hosting.Nats

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

* Refine AspireExport descriptions for polyglot-nats

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

* Update src/Aspire.Hosting.Nats/NatsBuilderExtensions.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Nats TypeScript validation apphost to exercise all exports

- Exercise addNats, withJetStream, withDataVolume, withDataBindMount
- Test withReference and withServiceReference on consumer container
- Add .modules/**/*.d.ts to tsconfig include

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Add polyglot exports for Aspire.Hosting.DevTunnels

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

* Refine AspireExport descriptions for polyglot-devtunnels

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

* Use generated methods in devtunnels apphost

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

* Complete AspireExport coverage for Aspire.Hosting.DevTunnels

Add [AspireExport] or [AspireExportIgnore] attributes to all 11 public
extension methods in DevTunnelResourceBuilderExtensions.cs.

Exported methods (6):
- addDevTunnel: Create dev tunnel resource
- withTunnelReference: Expose specific endpoint via tunnel
- withTunnelReferenceAnonymous: Expose endpoint with access control
- withTunnelReferenceAll: Expose all endpoints on a resource
- withAnonymousAccess: Make tunnel anonymously accessible
- getTunnelEndpoint: Get public tunnel endpoint for a given endpoint

Ignored methods (5) with reasons:
- WithReference(DevTunnelPortOptions): Not ATS-compatible
- WithReference(EndpointReference, DevTunnelPortOptions): Not ATS-compatible
- GetEndpoint<TResource>: Delegates to IResource overload
- GetEndpoint(IResource, string): IResource not ATS-mapped
- WithReference(targetResource, tunnelResource): Service discovery injection

Update TypeScript validation apphost to exercise all exported methods
and regenerate SDK. TypeScript compilation (tsc --noEmit) passes.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add AspireExport coverage for Azure AppConfiguration

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

* Address review feedback for polyglot-azure-appconfiguration

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add polyglot exports for Aspire.Hosting.Azure.WebPubSub

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

* Refine AspireExport descriptions for polyglot-azure-webpubsub

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

* Use generated methods in azure-webpubsub apphost

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

* Fix AspireExport coverage for Azure WebPubSub integration

- Fix addHub collision: remove [AspireExport] from simple overload,
  keep fuller overload with capability ID 'addHub'
- Add [AspireExportIgnore] to WithRoleAssignments with WebPubSubBuiltInRole[]
- Create AzureWebPubSubRole internal enum for ATS-compatible role shim
- Add polyglot WithRoleAssignments shim with [AspireExport]
- Update validation apphost.ts to exercise all exported APIs
- Regenerate TypeScript SDK

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add polyglot exports for Aspire.Hosting.Azure.ContainerRegistry

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

* Refine AspireExport descriptions for polyglot-azure-containerregistry

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

* Use generated methods in containerregistry apphost

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add polyglot exports for Aspire.Hosting.Milvus

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

* Refine AspireExport descriptions for polyglot-milvus

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

* Add AspireExport to Milvus WithAttu and update validation apphost

- Add [AspireExport("withAttu")] to WithAttu method in MilvusBuilderExtensions
- Update TypeScript validation apphost to exercise all exported methods:
  addMilvus, addDatabase, withAttu, withDataVolume, withDataBindMount,
  withConfigurationFile, and withReference from core
- Regenerate TypeScript SDK with withAttu support
- Clean up settings.json (remove sdkVersion and package versions)

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add dashboard browser setting for VS Code extension

Add settings to control which browser opens the Aspire dashboard during
debugging and whether to close it when debugging ends:

- aspire.dashboardBrowser: Choose between opening in default external
  browser (default), Chrome debug session, Edge debug session, or
  Firefox debug session
- aspire.closeDashboardOnDebugEnd: Automatically close the dashboard
  browser tab when debugging ends (works with debug browser options)

Debug browser sessions are launched as child sessions of the Aspire
debug session, so they automatically close when the parent session ends.

Dashboard lifecycle management is consolidated in AspireDebugSession.

* Update extension/src/debugger/AspireDebugSession.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update extension/src/debugger/AspireDebugSession.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update extension/src/server/interactionService.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update extension/src/debugger/AspireDebugSession.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Revert auto-generated schema changes

* Move DashboardBrowserType export after all imports

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Make template discovery async in aspire new command

Separate template definition (sync) from template availability
(async) so that NewCommand can register template subcommands without
blocking on async I/O in the constructor.

- Add sync GetTemplates() to ITemplateFactory/ITemplateProvider that
  returns template definitions without performing runtime checks
- Keep GetTemplatesAsync() for execution-time availability filtering
  (e.g. .NET SDK availability check)
- NewCommand constructor uses GetTemplates() for subcommand registration
- NewCommand.ExecuteAsync uses GetTemplatesAsync() to resolve which
  templates are actually available at runtime
- Template subcommands and per-template help output are preserved

Fixes #14805

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

* Filter .NET templates from subcommands when dotnet is not available

Add IsDotNetOnPath() sync check to DotNetTemplateFactory.GetTemplates()
so .NET templates are only registered as subcommands when dotnet is
found on PATH or via the private SDK installation. This addresses the
UX concern where 'aspire new --help' advertised .NET templates even on
systems without the .NET SDK installed.

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

---------

Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
#14786)

Co-authored-by: JamesNK <303201+JamesNK@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
* Add GitHubModelName enum for polyglot export support

- Generate internal GitHubModelName enum and GetModelId conversion method
  in tools/GenModel.cs and GitHubModel.Generated.cs
- Add internal AddGitHubModel(GitHubModelName) overload exported as
  addGitHubModel for polyglot app hosts
- Mark string and GitHubModel overloads as AspireExportIgnore
- Rename WithHealthCheck export to enableHealthCheck to avoid collision
  with core withHealthCheck(key)
- Update ValidationAppHost/apphost.ts to exercise all exported methods
- Fix tsconfig.json to include .d.ts files per convention

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

* Add addGitHubModelById for arbitrary model ID strings

Exports an internal addGitHubModelById method so TypeScript users can
pass model identifier strings (e.g. 'custom-vendor/custom-model') for
models not yet in the GitHubModelName enum.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
JamesNK and others added 3 commits March 3, 2026 22:47
…rt/stop/restart (#14930)

* Rename built-in resource commands: resource-start/stop/restart -> start/stop/restart

Rename the built-in resource command identifiers from 'resource-start',
'resource-stop', 'resource-restart' to 'start', 'stop', 'restart'.

- Update KnownResourceCommands constants to use the new short names
- Add internal legacy constants for backwards compatibility
- Add fallback mapping in ResourceCommandService so callers using
  the old names (e.g. 'resource-start') are mapped to the new names
- Remove the CLI ResourceCommand name-mapping layer (no longer needed)
- Update Dashboard CommandViewModel, MCP tools, and Assistant descriptions
- Update VS Code extension to check for both old and new command names
- Update all affected tests and add backwards-compat tests

* Remove duplicate test method
* Add polyglot exports for Aspire.Hosting.Oracle

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

* Refine AspireExport descriptions for polyglot-oracle

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

* Add AspireExport property coverage for Oracle hosting integration

- Add [AspireExport(ExposeProperties = true)] to OracleDatabaseServerResource
  and OracleDatabaseResource to expose properties to polyglot app hosts
- Add [AspireExportIgnore] on ConnectionStringExpression for both resources
- Update playground ValidationAppHost apphost.ts to exercise all exported
  methods: addOracle, addDatabase, withDataVolume, withDataBindMount,
  withInitFiles, withDbSetupBindMount, withReference, withServiceReference,
  fluent chaining, and property access
- Regenerate TypeScript SDK with updated property accessors
- Clean up settings.json (remove sdkVersion and package version)

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add project reference support for polyglot apphost integrations

Allow .aspire/settings.json packages entries to reference local .csproj files instead of NuGet versions. When a value ends in '.csproj', it's treated as a project reference: PrebuiltAppHostServer publishes it via dotnet publish and copies the full transitive DLL closure into the integration libs path. DotNetBasedAppHostServerProject adds ProjectReference elements to the generated csproj.

Introduces IntegrationReference record type to represent both NuGet packages and project references, replacing the (Name, Version) tuple throughout IAppHostServerProject.PrepareAsync and related APIs.

Fixes #14760

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

* Remove GetAllPackages, migrate tests to GetIntegrationReferences

Remove the now-unused GetAllPackages methods from AspireJsonConfiguration. Update tests to use GetIntegrationReferences instead. Add test for project reference detection (.csproj paths).

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

* Use single dotnet publish for PrebuiltAppHostServer integration resolution

Replace the two-step approach (BundleNuGetService restore + per-project publish) with a single synthetic .csproj that includes all PackageReferences and ProjectReferences, then dotnet publish once to get the full transitive DLL closure. Remove BundleNuGetService dependency from PrebuiltAppHostServer.

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

* Only use dotnet publish when project references are present

Restore BundleNuGetService for the NuGet-only path (no SDK required). Only use dotnet publish with a synthetic project when project references are present in settings.json (requires .NET SDK).

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

* Use dotnet build with CopyLocalLockFileAssemblies instead of publish

Build the synthetic integration project with OutDir pointing directly to the libs path, eliminating the need for dotnet publish and the extra copy step. Remove PublishProjectAsync from IDotNetCliRunner.

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

* Add SDK check for project refs and isolate from parent MSBuild imports

Check SDK availability before building project references and provide a clear error message if missing. Write Directory.Packages.props (CPM opt-out), Directory.Build.props, and Directory.Build.targets to the synthetic project directory to prevent parent MSBuild imports from interfering.

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

* Remove DotNetBasedAppHostServerProject casts from SDK commands

SdkGenerateCommand and SdkDumpCommand now use IAppHostServerProject.PrepareAsync instead of casting to DotNetBasedAppHostServerProject and calling CreateProjectFilesAsync/BuildAsync directly. This means they work in both dev mode and bundle mode with project references.

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

* Use CLI version for SDK commands, let project deps resolve transitively

SDK commands no longer reference DotNetBasedAppHostServerProject.DefaultSdkVersion. The codegen package uses VersionHelper.GetDefaultTemplateVersion() (CLI version), and Aspire.Hosting comes transitively from the integration project reference.

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

* Add unit tests for IntegrationReference and synthetic project generation

Tests cover IntegrationReference type properties, AspireJsonConfiguration.GetIntegrationReferences detection of .csproj paths, and PrebuiltAppHostServer.GenerateIntegrationProjectFile output (PackageReference, ProjectReference, OutDir, CopyLocalLockFileAssemblies, analyzer suppression).

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

* Add E2E test for project reference integration support

Tests the full flow: create a .NET hosting integration with [AspireExport], create a TypeScript AppHost, add the integration as a project reference in settings.json, start the AppHost, and verify the custom addMyService method appears in the generated TypeScript SDK.

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

* Simplify E2E test: use ExecuteCallback for file creation

Replace multiline cat heredocs with C# ExecuteCallback to write the integration project files and update settings.json. Reads sdkVersion from the settings.json that aspire init creates.

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

* Address PR review feedback

- Null-safe value handling in GetIntegrationReferences (trim, null check before .csproj detection)
- Clean stale libs directory before project ref build to prevent leftover DLLs
- Use XDocument for synthetic project generation instead of string interpolation (XML-safe)
- Filter SDK-only packages from ATS assembly list in DotNetBasedAppHostServerProject
- Restore xmldoc param comments on PrebuiltAppHostServer constructor

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

* Use using directive for System.Xml.Linq

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

* Improve project reference E2E test with describe/wait verification

Update apphost.ts to use the custom integration (addMyService), then verify with aspire wait and aspire describe that the resource actually runs. Reduce timeouts to be more reasonable.

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

* Fix E2E test: use redis image instead of nonexistent myservice

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

* Fix E2E test: correct project reference path and force codegen regeneration

The MyIntegration directory is inside the workspace (./MyIntegration not ../MyIntegration). Also delete .modules/ before aspire start to force re-codegen with the new integration.

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

* Fix: write nuget.config with channel sources for project ref builds

NuGetConfigMerger.CreateOrUpdateAsync is a no-op for implicit/hive channels. Instead, use GetNuGetSourcesAsync to get the actual feed URLs and write a nuget.config directly into the synthetic project directory. This ensures dotnet build can resolve Aspire packages from hive feeds in CI.

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

* Fix CheckAsync tuple deconstruction after release/13.2 rebase

PR #14811 removed ForceInstall from IDotNetSdkInstaller.CheckAsync, changing from 4-element to 3-element tuple.

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

* Add build output logging for integration project failures

Capture and log stdout/stderr from dotnet build when the synthetic integration project fails, to help diagnose CI failures.

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

* Dump child log on E2E test failure for CI debugging

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

* Fix: use RestoreConfigFile to ensure project references resolve from channel feeds

When the synthetic project has ProjectReferences, MSBuild restores the referenced project's packages from nuget.config nearest to that project's directory — not the synthetic project's directory. Add RestoreConfigFile to the synthetic .csproj so all projects in the build graph use our channel-aware nuget.config.

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

* Fix E2E test: write nuget.config in workspace for project reference resolution

MyIntegration.csproj needs to resolve Aspire.Hosting from the hive during dotnet build. MSBuild walks up from the project directory looking for nuget.config — without one in the workspace, it defaults to nuget.org which doesn't have prerelease versions. Write a nuget.config with hive sources in the workspace root.

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

* Address JamesNK review feedback

- Add IntegrationReference validation via factory methods (FromPackage/FromProject)
  ensuring exactly one of Version or ProjectPath is set
- Rename GetAllPackagesAsync to GetIntegrationReferencesAsync
- Add explicit null check for Version instead of null-forgiving operator
- Use DotNetBasedAppHostServerProject.TargetFramework constant instead of
  hardcoded "net10.0" in PrebuiltAppHostServer
- Replace RestoreConfigFile with RestoreAdditionalProjectSources MSBuild property
  to add channel sources without replacing the user's NuGet config
- Remove nuget.config generation with <clear/> and unconditional nuget.org addition
- Stop copying/overwriting user nuget.config (RestoreAdditionalProjectSources
  makes this unnecessary)

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

* Use RestoreAdditionalProjectSources in DotNetBasedAppHostServerProject

Align with PrebuiltAppHostServer: replace NuGetConfigMerger with RestoreAdditionalProjectSources for channel source resolution. This is additive and propagates to the entire restore graph including project references. Update test to verify csproj contains the correct sources instead of checking nuget.config.

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

* Address JamesNK and sebastienros review feedback

- IntegrationReference: change from record to class (JamesNK)
- Rename 'packages' locals to 'integrations' where assigned from GetIntegrationReferencesAsync (JamesNK)
- Call GetNuGetSourcesAsync unconditionally in BuildIntegrationProjectAsync (sebastienros)
- Always regenerate codegen when project references are present by including timestamp in hash (sebastienros)

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

* Resolve project ref assembly names from MSBuild build output

Add a custom MSBuild target to the synthetic project that writes resolved project reference assembly names to a file after build. Use these actual assembly names (which may differ from settings.json key or csproj filename if <AssemblyName> is overridden) for the AtsAssemblies list in appsettings.json. Move GenerateAppSettingsAsync to after build/restore in all cases for a simpler linear flow.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@radical radical requested a review from mitchdenny as a code owner March 5, 2026 18:40
Copilot AI review requested due to automatic review settings March 5, 2026 18:40
@radical radical requested a review from eerhardt as a code owner March 5, 2026 18:40
@github-actions
Copy link
Contributor

github-actions bot commented Mar 5, 2026

🚀 Dogfood this PR with:

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

curl -fsSL https://raw.githubusercontent.com/dotnet/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 14979

Or

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

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@github-actions
Copy link
Contributor

github-actions bot commented Mar 5, 2026

🎬 CLI E2E Test Recordings

The following terminal recordings are available for commit cd58460:

Test Recording
AddPackageInteractiveWhileAppHostRunningDetached ▶️ View Recording
AddPackageWhileAppHostRunningDetached ▶️ View Recording
AgentCommands_AllHelpOutputs_AreCorrect ▶️ View Recording
AgentInitCommand_MigratesDeprecatedConfig ▶️ View Recording
AgentInitCommand_WithMalformedMcpJson_ShowsErrorAndExitsNonZero ▶️ View Recording
AspireUpdateRemovesAppHostPackageVersionFromDirectoryPackagesProps ▶️ View Recording
Banner_DisplayedOnFirstRun ▶️ View Recording
Banner_DisplayedWithExplicitFlag ▶️ View Recording
Banner_NotDisplayedWithNoLogoFlag ▶️ View Recording
CreateAndDeployToDockerCompose ▶️ View Recording
CreateAndDeployToDockerComposeInteractive ▶️ View Recording
CreateAndPublishToKubernetes ▶️ View Recording
CreateAndRunAspireStarterProject ▶️ View Recording
CreateAndRunAspireStarterProjectWithBundle ▶️ View Recording
CreateAndRunJsReactProject ▶️ View Recording
CreateAndRunPythonReactProject ▶️ View Recording
CreateAndRunTypeScriptStarterProject ▶️ View Recording
CreateEmptyAppHostProject ▶️ View Recording
CreateStartAndStopAspireProject ▶️ View Recording
CreateStartWaitAndStopAspireProject ▶️ View Recording
CreateTypeScriptAppHostWithViteApp ▶️ View Recording
DescribeCommandResolvesReplicaNames ▶️ View Recording
DescribeCommandShowsRunningResources ▶️ View Recording
DetachFormatJsonProducesValidJson ▶️ View Recording
DoctorCommand_DetectsDeprecatedAgentConfig ▶️ View Recording
DoctorCommand_WithSslCertDir_ShowsTrusted ▶️ View Recording
DoctorCommand_WithoutSslCertDir_ShowsPartiallyTrusted ▶️ View Recording
LogsCommandShowsResourceLogs ▶️ View Recording
PsCommandListsRunningAppHost ▶️ View Recording
PsFormatJsonOutputsOnlyJsonToStdout ▶️ View Recording
SecretCrudOnDotNetAppHost ▶️ View Recording
SecretCrudOnTypeScriptAppHost ▶️ View Recording
StagingChannel_ConfigureAndVerifySettings_ThenSwitchChannels ▶️ View Recording
StopAllAppHostsFromAppHostDirectory ▶️ View Recording
StopAllAppHostsFromUnrelatedDirectory ▶️ View Recording
StopNonInteractiveMultipleAppHostsShowsError ▶️ View Recording
StopNonInteractiveSingleAppHost ▶️ View Recording
StopWithNoRunningAppHostExitsSuccessfully ▶️ View Recording
TypeScriptAppHostWithProjectReferenceIntegration ▶️ View Recording

📹 Recordings uploaded automatically from CI run #22788210405

@radical
Copy link
Member Author

radical commented Mar 5, 2026

@copilot investigate the failures.

Copy link
Contributor

Copilot AI commented Mar 5, 2026

@radical I've opened a new pull request, #14984, to work on those changes. Once the pull request is ready, I'll request review from you.

@radical
Copy link
Member Author

radical commented Mar 5, 2026

@sebastienros could you please take a look at the polyglot failures? Maybe I made some mistake in the merge?

@radical
Copy link
Member Author

radical commented Mar 6, 2026

Polyglot validation fix: revert EnableAspireContainerTunnel default

cc @radical @karolz-ms

Root cause: The merge conflict on DcpExecutor.cs was resolved by taking release/13.2's version (PR #14686's debug refactor), which discarded PR #14557's parallel, tunnel-aware container creation (588 lines). However, DcpOptions.cs had no conflict, so #14557's EnableAspireContainerTunnel = true default was auto-preserved.

This creates a mismatch:

The old DcpExecutor unconditionally blocks all container creation behind EnsureContainerServiceAddressInfo() (10-min timeout for tunnel service addresses). The polyglot tests time out at 2 minutes waiting for Redis, which is stuck behind tunnel initialization.

Fix (4cac75f): Revert EnableAspireContainerTunnel to false, matching the DcpExecutor code taken from release/13.2. After this backmerge lands on main, = true is already there with the matching DcpExecutor from #14557, so tunnel support remains enabled on main going forward.

- Copilot

@radical
Copy link
Member Author

radical commented Mar 6, 2026

Polyglot validation fix: revert EnableAspireContainerTunnel default

Does the fix and explanation make sense?

@karolz-ms
Copy link
Contributor

Polyglot validation fix: revert EnableAspireContainerTunnel default

Does the fix and explanation make sense?

NO, it does not.

We have a conflict between two big PRs: one that went into main #14557 and one that went into 13.2 #14686

@adamint you will probably need to "manually" re-apply your PR into main; the changes to DcpExecutor are to intertwined for an automatic merge. LMK if you need any help with that.

# Conflicts:
#	eng/Versions.props
#	src/Aspire.Cli/Resources/xlf/ResourceCommandStrings.cs.xlf
#	src/Aspire.Cli/Resources/xlf/ResourceCommandStrings.de.xlf
#	src/Aspire.Cli/Resources/xlf/ResourceCommandStrings.es.xlf
#	src/Aspire.Cli/Resources/xlf/ResourceCommandStrings.fr.xlf
#	src/Aspire.Cli/Resources/xlf/ResourceCommandStrings.it.xlf
#	src/Aspire.Cli/Resources/xlf/ResourceCommandStrings.ja.xlf
#	src/Aspire.Cli/Resources/xlf/ResourceCommandStrings.ko.xlf
#	src/Aspire.Cli/Resources/xlf/ResourceCommandStrings.pl.xlf
#	src/Aspire.Cli/Resources/xlf/ResourceCommandStrings.pt-BR.xlf
#	src/Aspire.Cli/Resources/xlf/ResourceCommandStrings.ru.xlf
#	src/Aspire.Cli/Resources/xlf/ResourceCommandStrings.tr.xlf
#	src/Aspire.Cli/Resources/xlf/ResourceCommandStrings.zh-Hans.xlf
#	src/Aspire.Cli/Resources/xlf/ResourceCommandStrings.zh-Hant.xlf
#	src/Aspire.Cli/Resources/xlf/StopCommandStrings.cs.xlf
#	src/Aspire.Cli/Resources/xlf/StopCommandStrings.de.xlf
#	src/Aspire.Cli/Resources/xlf/StopCommandStrings.es.xlf
#	src/Aspire.Cli/Resources/xlf/StopCommandStrings.fr.xlf
#	src/Aspire.Cli/Resources/xlf/StopCommandStrings.it.xlf
#	src/Aspire.Cli/Resources/xlf/StopCommandStrings.ja.xlf
#	src/Aspire.Cli/Resources/xlf/StopCommandStrings.ko.xlf
#	src/Aspire.Cli/Resources/xlf/StopCommandStrings.pl.xlf
#	src/Aspire.Cli/Resources/xlf/StopCommandStrings.pt-BR.xlf
#	src/Aspire.Cli/Resources/xlf/StopCommandStrings.ru.xlf
#	src/Aspire.Cli/Resources/xlf/StopCommandStrings.tr.xlf
#	src/Aspire.Cli/Resources/xlf/StopCommandStrings.zh-Hans.xlf
#	src/Aspire.Cli/Resources/xlf/StopCommandStrings.zh-Hant.xlf
#	src/Aspire.Cli/Telemetry/AspireCliTelemetry.cs
#	src/Aspire.Hosting.RemoteHost/Ats/AtsMarshaller.cs
#	tests/Aspire.Hosting.RemoteHost.Tests/AtsMarshallerTests.cs
#	tests/Aspire.Hosting.RemoteHost.Tests/CapabilityDispatcherTests.cs
@radical
Copy link
Member Author

radical commented Mar 7, 2026

We have a conflict between two big PRs: one that went into main #14557 and one that went into 13.2 #14686

I have updated the branch to merge up to @adamint's commit.

@radical radical requested review from davidfowl and karolz-ms March 7, 2026 02:09
@radical radical merged commit 5b9f816 into main Mar 7, 2026
759 of 763 checks passed
@radical radical deleted the backmerge branch March 7, 2026 02:15
@dotnet-policy-service dotnet-policy-service bot added this to the 13.3 milestone Mar 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Backmerge] Merge conflicts between release/13.2 and main

10 participants