Skip to content

Merge release/13.2 into main (manual conflict resolution)#14657

Merged
joperezr merged 26 commits intomainfrom
merge-release-13.2
Feb 25, 2026
Merged

Merge release/13.2 into main (manual conflict resolution)#14657
joperezr merged 26 commits intomainfrom
merge-release-13.2

Conversation

@joperezr
Copy link
Member

Fixes #14636

Summary

This PR manually merges release/13.2 into main, resolving the merge conflicts that prevented the automated daily back-merge workflow from completing.

Important

This PR should NOT be squash-merged. It must be merged with a merge commit to preserve the release branch history. @joperezr will handle the merge once the PR is approved.

Merge Conflicts & Resolutions

1. eng/Version.Details.xml — Whitespace-only conflict

  • Cause: Automated dependency updates (dotnet-maestro) used different indentation on each branch (4-space on main vs 6-space on release/13.2). Both branches had the same DCP version (0.22.7).
  • Resolution: Kept main's 4-space indentation style.

2. tests/Aspire.Cli.EndToEnd.Tests/DescribeCommandTests.cs — File rename conflict

3. tests/Aspire.Cli.EndToEnd.Tests/Helpers/CliE2ETestHelpers.cs — Refactored shared helpers vs new methods

4. tests/Aspire.Deployment.EndToEnd.Tests/Helpers/DeploymentE2ETestHelpers.cs — Same pattern as #3

Additional post-merge fixes

Several auto-merged files from release/13.2 (StopNonInteractiveTests.cs, StartStopTests.cs, AgentCommandTests.cs, AcaDeploymentErrorOutputTests.cs) used the old verbose Hex1bTerminal.CreateBuilder() pattern that was refactored on main. Updated 8 occurrences to use CreateTestTerminal() and removed unnecessary using Hex1b; directives to pass the build.

Validation

  • Both Aspire.Cli.EndToEnd.Tests and Aspire.Deployment.EndToEnd.Tests build successfully with 0 warnings and 0 errors.

cc @JamesNK @mitchdenny @maddymontaquila @davidfowl for a quick review of the conflict resolutions in your respective areas.

mitchdenny and others added 25 commits February 23, 2026 14:40
* Fix aspire stop --non-interactive with multiple AppHosts (#14558)

When multiple AppHosts are running and aspire stop --non-interactive is used,
the CLI now handles the scenario gracefully instead of crashing:

- Single AppHost: auto-selects and stops it without prompting
- Multiple AppHosts: shows clear error message suggesting --project or --all
- No running AppHosts: shows appropriate error message

Added --all option to stop all running AppHosts at once, which works in both
interactive and non-interactive modes.

Also adds WaitForAnyPrompt helper for E2E tests that expect non-zero exit codes,
and three E2E test scenarios covering the new behavior.

Fixes #14558

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

* Address PR review comments

- Add --all/--project mutual exclusivity validation
- Thread CancellationToken through StopAppHostAsync and all callers
- Add XML doc summaries to private methods
- Rewrite StopAllAppHosts test to create 2 projects and verify both are stopped
- Split into two tests: from AppHost dir and from unrelated dir

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

* Fix --non-interactive to take precedence over ASPIRE_PLAYGROUND

The --non-interactive flag was being overridden by ASPIRE_PLAYGROUND=true
in CliHostEnvironment, causing non-interactive mode to be ignored in E2E
tests. Swap the priority so explicit --non-interactive always wins.

Also use --project in StopNonInteractiveSingleAppHost test to avoid
interference from concurrent tests sharing the backchannel directory.

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

* Address JamesNK review feedback

- Move error strings to resource files with format placeholders
- Scope non-interactive auto-select to in-scope AppHosts only
- Stop AppHosts in parallel instead of sequentially
- Add ILogger logging to StopAllAppHostsAsync
- Handle --all with resource argument mutual exclusivity
- Use CultureInfo.InvariantCulture for string.Format calls

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>
* Stop command exits with 0 when no AppHost is running

When running 'aspire stop' and no AppHost is running, the command now
returns exit code 0 and displays an informational message instead of
exit code 7 (FailedToFindProject) with an error message. This aligns
with the expected behavior that stopping nothing is not an error.

Fixes part of #14238

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

* Add E2E test for stop command with no running AppHost

Validates that 'aspire stop' exits with code 0 and shows an
informational message when no AppHost is running, rather than
returning an error exit code.

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>
* Fix AKS deployment test timeouts and ACR token expiration

- Increase az aks update --attach-acr timeout from 3 to 5 minutes
  (ReconcilingAddons phase can take several minutes)
- Increase kubectl wait pod readiness timeout from 120s to 300s
  (pods need time to pull images from ACR and start)
- Add ACR re-login step after AKS creation to refresh Docker
  credentials that may have expired during 10-15 min provisioning
  (OIDC federated tokens expire after ~5 minutes)

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

* Fix WaitForSuccessPrompt timeout for chained kubectl waits

The Redis test chains 3 kubectl wait commands (300s each), so the
worst-case total is 900s (15 min). Increase WaitForSuccessPrompt
from 6 min to 16 min to provide adequate buffer.

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>
* Stop running AppHost before adding packages

When running 'aspire add' while an AppHost is running in detached mode,
the project file is locked by the build server, causing 'dotnet add
package' to fail. The add command now stops any running AppHost instance
before attempting to add the package, using the same running instance
detection pattern used by the run command.

Fixes part of #14238

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

* Add E2E test for adding package while AppHost is running

Validates that 'aspire add' succeeds when an AppHost is running in
detached mode. The add command should automatically stop the running
AppHost to release file locks before modifying the project.

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

* Fix E2E test to handle version selection prompt

The aspire add --non-interactive flag doesn't suppress the version
selection prompt. Updated the test to wait for and accept the default
version before continuing.

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

* Address PR feedback and add interactive add E2E test

- Gate CheckAndHandleRunningInstanceAsync behind
  KnownFeatures.RunningInstanceDetectionEnabled feature flag,
  matching RunCommand behavior
- Check RunningInstanceResult.StopFailed return value and fail
  early with a clear error message instead of proceeding
- Add E2E test for interactive aspire add flow (no integration
  argument) while AppHost is running in detached mode

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

* Fix E2E test: accept any exit code from aspire stop cleanup

The aspire add command now auto-stops the running AppHost, so the
subsequent aspire stop cleanup command returns exit code 7 (no running
instances found). Use a generic prompt pattern that accepts both OK
and ERR exit codes for the cleanup step.

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

* Fix E2E test: wait for stop output text instead of prompt pattern

The RightText() method checks for immediately-adjacent text, but
the ERR prompt has intermediate text between the counter and '] $'.
Instead, wait for the known aspire stop output messages which
correctly handles both 'no running instances' and 'stopped
successfully' outcomes.

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

* Rename CheckAndHandleRunningInstanceAsync to FindAndStopRunningInstanceAsync

Address PR feedback from JamesNK: the method name is more descriptive
about what the method actually does — finds running instances and stops
them.

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

* Add info message when running instance is successfully stopped

Addresses review feedback: log on both success and failure of
stopping a running AppHost, not just failure.

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

* Retrigger CI

* Fix invalid Spectre emoji name in DisplayMessage

Use 'information_source' instead of 'info' which is not a valid
Spectre Console emoji name, causing garbled terminal output.

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

* Fix E2E test: --non-interactive skips version selection prompt

The AddPackageWhileAppHostRunningDetached test was waiting for a version
selection prompt that doesn't appear with --non-interactive flag. Remove
the intermediate wait and directly wait for the package added success message.

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>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…onfiguration (#14618)

* Add WithMcpServer extension method to ResourceBuilderExtensions

Co-authored-by: davidfowl <95136+davidfowl@users.noreply.github.com>

* Move WithMcpServer to dedicated class with improved API

- Move WithMcpServer from ResourceBuilderExtensions to new
  McpServerResourceBuilderExtensions class
- Make endpointName optional, defaulting to https then http fallback
  (consistent with WithHttpHealthCheck pattern)
- Add [Experimental("ASPIREMCP001")] and [EndpointName] attributes
- Update PostgresBuilderExtensions to use new extension method
- Add tests for default endpoint selection and fallback behavior

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

* Apply suggestions from code review

Co-authored-by: David Fowler <davidfowl@gmail.com>

* Update src/Aspire.Hosting/McpServerResourceBuilderExtensions.cs

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: davidfowl <95136+davidfowl@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: James Newton-King <james@newtonking.com>
- Render local and global configuration in Spectre.Console tables with
  rounded borders and titled headers for visual distinction
- Show each available feature on its own line with description and
  default value instead of a comma-separated list
- Add hint text showing how to enable/disable features via
  aspire config set

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: eerhardt <8291187+eerhardt@users.noreply.github.com>
* Handle malformed MCP JSON config files gracefully

When 'aspire mcp init' or 'aspire agent init' encounters an MCP config
file (e.g., .vscode/mcp.json) containing empty or malformed JSON, the
CLI previously crashed with an unhandled JsonReaderException.

This change wraps JsonNode.Parse() calls in try-catch blocks in all four
agent environment scanner Apply methods (VsCode, CopilotCli, ClaudeCode,
OpenCode). On malformed JSON, a descriptive InvalidOperationException is
thrown with the file path, which is caught by AgentInitCommand and
displayed as a user-friendly error. The malformed file is NOT
overwritten, preserving the user's content so they can fix it manually.

Fixes #14394

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

* Add explicit skip message and non-zero exit code for malformed config files

When a malformed JSON config file is encountered, now displays:
- The error message identifying the file
- An explicit 'Skipping update of ...' message
- Returns a non-zero exit code (1)

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

* Add E2E test for malformed MCP JSON config handling

Adds AgentInitCommand_WithMalformedMcpJson_ShowsErrorAndExitsNonZero
which:
1. Creates a .vscode folder with a malformed mcp.json
2. Runs 'aspire agent init' and selects VS Code configuration
3. Verifies the error message about malformed JSON appears
4. Verifies the 'Skipping' message appears
5. Verifies the command exits with non-zero exit code
6. Verifies the original malformed file was NOT overwritten

Also adds WaitForErrorPrompt and CreateMalformedMcpConfig helpers.

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

* Fix E2E test: handle additional options prompt in agent init

The agent init command shows two multi-select prompts:
1. Agent environments (VS Code, OpenCode, Claude Code)
2. Additional options (skill files, Playwright)

The test was missing handling for the second prompt, causing a
timeout. Spectre.Console MultiSelectionPrompt requires at least
one selection, so we select the first skill file option.

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

* Extract shared McpConfigFileHelper to reduce duplication

Move duplicated JSON config file reading and server-check logic
from 4 scanner files into a shared McpConfigFileHelper class with
two methods:

- HasServerConfigured: sync read + parse + check (for Has* methods)
- ReadConfigAsync: async read + parse with error handling (for Apply*)

Both accept an optional preprocessContent delegate for JSONC support
(used by OpenCode scanner). This removes ~360 lines of duplicated
boilerplate across VsCode, CopilotCli, ClaudeCode, and OpenCode
scanners.

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

* Display partial success warning when agent init encounters errors

When some applicators fail due to malformed JSON config files, display a
warning message 'Configuration completed with errors' instead of silently
returning a non-zero exit code. The success message is only shown when all
applicators succeed.

Also update the E2E test to verify the new warning message is displayed.

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

* Add malformed JSON tests for CopilotCli, ClaudeCode, and OpenCode scanners

Address review feedback to add test coverage for malformed JSON handling
across all agent environment scanners, not just VsCode. Each scanner now
has tests for malformed JSON, empty files, and file preservation.

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>
…er (#14590)

* Add a script for startup performance measurement (#14345)

* Add startup perf collection script

* Analyze trace more efficiently

* Increase pause between iterations

* Fix TraceAnalyzer

* Add startup-perf skill

* Add backmerge release workflow to automate merging changes from release/13.2 to main (#14453)

* Add backmerge release workflow to automate merging changes from release/13.2 to main

* Apply suggestions from code review

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

* Apply more fixes and use dotnet's action

---------

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

* Bump Aspire branding from 13.2 to 13.3 (#14456)

* Initial plan

* Bump Aspire branding from 13.2 to 13.3

Co-authored-by: joperezr <13854455+joperezr@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: joperezr <13854455+joperezr@users.noreply.github.com>

* Update Azure.Core to latest version - lift all runtime dependencies to latest (#14361)

* Update to Azure.Core 1.51.1

Use latest versions for all dotnet/runtime nuget packages. This simplifies our dependency management.

Remove ForceLatestDotnetVersions property from multiple project files

* Update AzureDeployerTests to use WaitForShutdown instead of StopAsync

There is a timing issue when using Start/Stop since the background pipeline might still be running and it cancels the pipeline before it can complete.

* Fix AuxiliaryBackchannelTests by adding a Task that completes when the AuxiliaryBackchannelService is listening and ready for connections.

* Remove double registration of AuxiliaryBackchannelService as an IHostedService.

* Fix ResourceLoggerForwarderServiceTests to ensure the ResourceLoggerForwarderService has started before signalling the stopping token.

* Update Arcade to latest version from the .NET 10 Eng channel (#13556)

Co-authored-by: Jose Perez Rodriguez <joperezr@microsoft.com>

* Refactor backmerge PR creation to update existing PRs and streamline body formatting (#14476)

* [main] Fix transitive Azure role assignments through WaitFor dependencies (#14478)

* Initial plan

* Fix transitive Azure role assignments through WaitFor dependencies

Remove CollectAnnotationDependencies calls from CollectDependenciesFromValue
to prevent WaitFor/parent/connection-string-redirect annotations from
referenced resources being included as direct dependencies of the caller.

Add tests verifying:
- DirectOnly mode excludes WaitFor deps from referenced resources
- WaitFor doesn't create transitive role assignments in Azure publish

Co-authored-by: eerhardt <8291187+eerhardt@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: eerhardt <8291187+eerhardt@users.noreply.github.com>

* Remove auto-merge step from backmerge workflow (#14481)

* Remove auto-merge step from backmerge workflow

* Update PR body to request merge commit instead of auto-merge

* Add agentic workflow daily-repo-status (#14498)

* [Automated] Backmerge release/13.2 to main (#14536)

* Fix Windows pipeline image to use windows.vs2022.amd64.open (#14492)

* Fix Windows pipeline image to use windows.vs2022.amd64.open

* Use windows.vs2026preview.scout.amd64 for public pipeline Windows pool

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

---------

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

* Add Azure portal link for Resource Group in deploy pipeline summary (#14434)

* Add Azure portal link for Resource Group in pipeline summary

When printing the Resource Group in the pipeline summary of `aspire deploy`,
include a clickable link to the Azure portal resource group page.

The link uses the format:
https://portal.azure.com/#@{tenantId}/resource/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/overview

Changes:
- AzureEnvironmentResource.AddToPipelineSummary: construct markdown link for resource group
- ConsoleActivityLogger.FormatPipelineSummaryKvp: convert markdown to Spectre markup for clickable links
- Add ConsoleActivityLoggerTests for the new markdown rendering behavior

Co-authored-by: eerhardt <8291187+eerhardt@users.noreply.github.com>

* Clean up the code

* Fix tests

* More test fixups

* Refactor code

* Update src/Aspire.Cli/Utils/MarkdownToSpectreConverter.cs

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

* Add test for color-enabled non-interactive rendering path

Co-authored-by: eerhardt <8291187+eerhardt@users.noreply.github.com>

* fix test

---------

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>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Jose Perez Rodriguez <joperezr@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <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>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* [Automated] Update AI Foundry Models (#14541)

Co-authored-by: sebastienros <sebastienros@users.noreply.github.com>

* Detect CLI at default install paths when not on PATH (#14545)

Check default installation directories (~/.aspire/bin, ~/.dotnet/tools) when the
Aspire CLI is not found on the system PATH. If found at a default location, the
VS Code setting is auto-updated. If later found on PATH, the setting is cleared.

Resolution order: configured custom path > system PATH > default install paths.

Fixes #14235

* [automated] Unquarantine stable tests with 25+ days zero failures (#14531)

* Initial plan

* [automated] Unquarantine stable tests

- Unquarantined: DeployCommandIncludesDeployFlagInArguments
- Unquarantined: GetAppHostsCommand_WithMultipleProjects_ReturnsSuccessWithAllCandidates
- Unquarantined: GetAppHostsCommand_WithSingleProject_ReturnsSuccessWithValidJson
- Unquarantined: PushImageToRegistry_WithRemoteRegistry_PushesImage
- Unquarantined: ProcessParametersStep_ValidatesBehavior
- Unquarantined: WithHttpCommand_EnablesCommandOnceResourceIsRunning

These tests are being unquarantined as they have had 25+ days of quarantined run data with zero failures.

Co-authored-by: radical <1472+radical@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: radical <1472+radical@users.noreply.github.com>

* Partially fix quarantined test: Update stale snapshot for DeployAsync_WithMultipleComputeEnvironments_Works (#14551)

* Initial plan

* Update snapshot for DeployAsync_WithMultipleComputeEnvironments_Works test

Co-authored-by: radical <1472+radical@users.noreply.github.com>

* Remove quarantine attribute from DeployAsync_WithMultipleComputeEnvironments_Works test

Co-authored-by: radical <1472+radical@users.noreply.github.com>

* Restore quarantine attribute - step="deploy" case still fails

Co-authored-by: radical <1472+radical@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: radical <1472+radical@users.noreply.github.com>

* Update daily report to 13.2 milestone burndown (#14563)

* Update daily report to 13.2 milestone burndown

Refocus the daily-repo-status agentic workflow to serve as a 13.2
release burndown report:

- Track 13.2 milestone issues closed/opened in the last 24 hours
- Highlight new bugs added to the milestone
- Summarize PRs merged to release/13.2 branch
- List PRs targeting release/13.2 awaiting review
- Surface relevant 13.2 discussions
- Generate a Mermaid xychart burndown using cache-memory snapshots
- Keep general triage queue as a brief secondary section
- Schedule daily around 9am, auto-close older report issues

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

* Address review feedback: clarify cache schema and queries

- Exclude PRs from milestone counts (issues-only filter)
- Specify exact JSON schema for cache-memory burndown snapshots
- Add dedup, sort, and trim-to-7 logic for cache entries
- Simplify 'new issues' query to opened-in-last-24h with milestone

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

---------

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

* Update Aspire.Hosting.Kubernetes.csproj

* Initialize _kubernetesComponents with ResourceNameComparer

* Update KubernetesPublisherTests.cs

* Update Aspire.Hosting.Kubernetes.csproj

* Adds snapshots

* Adds Chart.yaml to snapshot

---------

Co-authored-by: Karol Zadora-Przylecki <karolz@microsoft.com>
Co-authored-by: Jose Perez Rodriguez <joperezr@microsoft.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: joperezr <13854455+joperezr@users.noreply.github.com>
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
Co-authored-by: dotnet-maestro[bot] <42748379+dotnet-maestro[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: eerhardt <8291187+eerhardt@users.noreply.github.com>
Co-authored-by: David Negstad <50252651+danegsta@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Mitch Denny <midenn@microsoft.com>
Co-authored-by: sebastienros <sebastienros@users.noreply.github.com>
Co-authored-by: Adam Ratzman <adam@adamratzman.com>
Co-authored-by: radical <1472+radical@users.noreply.github.com>
Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…#14572)

* Redirect human-readable messages to stderr when --format json is used

When running `aspire run --detach --format json`, messages like
"Finding apphosts..." and "Stopping previous instance..." were written
to stdout alongside the JSON output, making it impossible to parse the
JSON programmatically.

Add a `UseStderrForMessages` property to IInteractionService. When
enabled, ConsoleInteractionService routes all human-readable display
methods through stderr while keeping DisplayRawText on stdout for
structured output. The property is set in ExecuteDetachedAsync when
the output format is JSON.

Fixes #14423

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

* Address PR feedback: replace UseStderrForMessages with ConsoleOutput enum

- Add ConsoleOutput enum (Standard, Error) for explicit console targeting
- Replace DIM UseStderrForMessages with standard DefaultConsole property
- Add optional ConsoleOutput parameter to DisplayRawText for explicit targeting
- Update all IInteractionService implementations

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

* Use Throw for multiple apphosts when --format json; add E2E test

When --format json is used with aspire run --detach, use
MultipleAppHostProjectsFoundBehavior.Throw instead of Prompt to prevent
interactive selection UI from polluting stdout JSON output. Users should
specify --project explicitly in this case.

Added MultipleAppHostTests E2E test that creates two single-file apphosts
and verifies the selection prompt appears when multiple are found.

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

* Fix MultipleAppHostTests: use real aspire new projects and assert on errors

The previous test used stub single-file apphosts that couldn't resolve
the Aspire.AppHost.Sdk, so the selection prompt appeared but the
selected apphost failed to build. The test passed vacuously.

Now creates two real projects via aspire new, verifies the selection
prompt appears, selects one, and asserts the apphost actually starts.
Adds explicit error assertions for SDK resolution and missing project
failures to fail fast with descriptive messages.

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

* Rewrite test: validate --detach --format json produces valid JSON

Instead of testing multiple-apphost selection prompts, the test now
validates the core PR concern: that aspire run --detach --format json
produces well-formed JSON on stdout without human-readable message
pollution.

The test creates a single project, runs aspire run --detach first,
then runs aspire run --detach --format json > output.json and validates
the output file is parseable JSON with expected fields.

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

* Fix detach test: wait for prompt, not nonexistent message

The WaitUntil was looking for 'The apphost is running in the
background.' which doesn't exist. The actual output is the AppHost
summary table followed by the shell prompt. Use WaitForSuccessPrompt
directly which correctly waits for the [N OK] $ prompt.

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>
…tribute (#14630)

Add #pragma warning disable ASPIREACANAMING001 to the generated apphost.cs
in AcaCompactNamingDeploymentTests so the test compiles after the
[Experimental] attribute was added to WithCompactResourceNaming().

Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…y environment variables (#14626)

* Use scheme instead of endpoint name when registering service discovery environment variables

* Respond to PR comments

* Simplify OTLP extraction to avoid service discovery lookup
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Fowler <davidfowl@gmail.com>
Co-authored-by: James Newton-King <james@newtonking.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Improve Azure deployment error output

Fixes #12303

- Add ProvisioningFailedException to throw clean error messages from
  AzureBicepResource instead of re-throwing raw RequestFailedException
  whose Message property includes verbose HTTP status, content, and headers.

- Skip redundant error wrapping for DistributedApplicationException in
  ExecuteStepAsync, since these exceptions already have user-friendly
  messages that don't need 'Step ... failed: ' prefix prepended.

- Update Verify snapshot for the now-cleaner error format.

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

* Add E2E deployment test for clean error output

Add AcaDeploymentErrorOutputTests that deploys with an invalid Azure
location ('invalidlocation') to deliberately induce a provisioning
failure, then verifies the error output does not contain verbose HTTP
headers, status codes, or raw Content blocks from RequestFailedException.

Also add WaitForAnyPrompt helper to DeploymentE2ETestHelpers for tests
that expect commands to fail (non-zero exit code).

Relates to #12303

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

* Fix E2E test: unset Azure__Location from workflow env

The deployment-tests.yml workflow sets Azure__Location=westus3 at the
job level. On Linux, environment variables are case-sensitive, so
AZURE__LOCATION=invalidlocation doesn't override Azure__Location.
Unset the workflow variable and set both casings to ensure the invalid
location is used.

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

* Fix verbose error output in create-provisioning-context step

E2E test revealed that RequestFailedException with verbose HTTP headers
also leaks through BaseProvisioningContextProvider.CreateProvisioningContextAsync
when resource group creation fails (e.g., invalid location).

Wrap the CreateOrUpdateAsync call in a try/catch for RequestFailedException
and throw ProvisioningFailedException with a clean extracted error message.

Make ExtractDetailedErrorMessage internal so it can be reused from
BaseProvisioningContextProvider.

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

* Address PR feedback: improve error format, use exact assertions, trim constructors

- Change ExtractDetailedErrorMessage format from 'code: message' to
  'Error code = code, Message = message' to avoid confusing double-colon
  when combined with context like 'Failed to create resource group: ...'
- Remove unused constructors from ProvisioningFailedException (only
  message+inner is used)
- Replace fuzzy DoesNotContain/Contains assertions with Verify snapshot
  testing for exact error message validation

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>
* Squash branch changes for release/13.2

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

* Remove CLI size check from clipack

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…er (#14653)

* Update Aspire.Hosting.Kubernetes.csproj

* Initialize _kubernetesComponents with ResourceNameComparer

* Update KubernetesPublisherTests.cs

* Update Aspire.Hosting.Kubernetes.csproj

* Adds snapshots

* Adds Chart.yaml to snapshot

---------

Co-authored-by: Benjamin Bartels <benjamin@bartels.dev>
…t pipeline (#14650)

The Windows build in BuildAndTest.yml was missing the Bundle.proj step
that Linux/macOS have in build_sign_native.yml, producing an unbundled
CLI binary.

- Add Bundle.proj payload build step per target RID before the main build
- Default BundlePayloadPath to convention path in Common.projitems
- Fail the build with clear error if bundle payload is missing

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@joperezr joperezr requested a review from radical as a code owner February 24, 2026 20:11
Copilot AI review requested due to automatic review settings February 24, 2026 20:11
@github-actions
Copy link
Contributor

github-actions bot commented Feb 24, 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 -- 14657

Or

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

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.

Pull request overview

This PR merges the release/13.2 branch into main to bring in features and fixes from the release branch. The merge resolves conflicts related to file renames, shared helper refactoring, and version updates.

Changes:

  • Merged release/13.2 branch with manual conflict resolution for renamed files and refactored test helpers
  • Updated localization files with new translation strings for CLI commands
  • Added new resource strings for CLI features (non-interactive mode, timestamps, error messages)

Reviewed changes

Copilot reviewed 292 out of 427 changed files in this pull request and generated no comments.

Show a summary per file
File Description
Multiple xlf files Added new translation entries for CLI command descriptions and options
Resource .resx files Updated English source strings for CLI commands and added new resource entries
Various .sh/.yml files Updated polyglot validation scripts to use --language instead of -l flag
Aspire.Cli project files Updated dependencies, removed NuGetHelper project, added new certificate generation code
Test helper files Merged refactored shared test helpers from main with new methods from release/13.2
Files not reviewed (8)
  • src/Aspire.Cli/Resources/AddCommandStrings.Designer.cs: Language not supported
  • src/Aspire.Cli/Resources/AgentCommandStrings.Designer.cs: Language not supported
  • src/Aspire.Cli/Resources/ConfigCommandStrings.Designer.cs: Language not supported
  • src/Aspire.Cli/Resources/DescribeCommandStrings.Designer.cs: Language not supported
  • src/Aspire.Cli/Resources/HelpGroupStrings.Designer.cs: Language not supported
  • src/Aspire.Cli/Resources/LogsCommandStrings.Designer.cs: Language not supported
  • src/Aspire.Cli/Resources/RootCommandStrings.Designer.cs: Language not supported
  • src/Aspire.Cli/Resources/StopCommandStrings.Designer.cs: Language not supported

@JamesNK
Copy link
Member

JamesNK commented Feb 24, 2026

I think I need to backport #14369 (E2E test refactor) to release/13.2. We'll keep getting conflicts from differences between 13.2 and main.

@github-actions
Copy link
Contributor

github-actions bot commented Feb 24, 2026

🎬 CLI E2E Test Recordings

The following terminal recordings are available for commit 7bcaa30:

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
CreateAndDeployToDockerCompose ▶️ View Recording
CreateAndDeployToDockerComposeInteractive ▶️ View Recording
CreateAndPublishToKubernetes ▶️ View Recording
CreateAndRunAspireStarterProject ▶️ View Recording
CreateAndRunAspireStarterProjectWithBundle ▶️ View Recording
CreateAndRunJsReactProject ▶️ View Recording
CreateAndRunPythonReactProject ▶️ View Recording
CreateEmptyAppHostProject ▶️ View Recording
CreateStartAndStopAspireProject ▶️ View Recording
CreateStartWaitAndStopAspireProject ▶️ View Recording
CreateTypeScriptAppHostWithViteApp ▶️ 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
StagingChannel_ConfigureAndVerifySettings_ThenSwitchChannels ▶️ View Recording
StopAllAppHostsFromAppHostDirectory ▶️ View Recording
StopAllAppHostsFromUnrelatedDirectory ▶️ View Recording
StopNonInteractiveMultipleAppHostsShowsError ▶️ View Recording
StopNonInteractiveSingleAppHost ▶️ View Recording
StopWithNoRunningAppHostExitsSuccessfully ▶️ View Recording

📹 Recordings uploaded automatically from CI run #22380728824

@joperezr
Copy link
Member Author

I think I need to backport #14369 (E2E test refactor) to release/13.2. We'll keep getting conflicts from differences between 13.2 and main.

That's fine by me. Are you saying we should wait for that or okay to merge this and then do that to prevent future conflicts?

@JamesNK
Copy link
Member

JamesNK commented Feb 25, 2026

Backport #14667

Doesn't need to block this PR. I did some work to check there aren't changes between change files between branches. Hopefully shouldn't generate more conflicts next merge PR.

…-13.2

# Conflicts:
#	eng/Version.Details.xml
#	tests/Aspire.Cli.EndToEnd.Tests/DescribeCommandTests.cs
#	tests/Aspire.Cli.EndToEnd.Tests/Helpers/CliE2ETestHelpers.cs
#	tests/Aspire.Deployment.EndToEnd.Tests/Helpers/DeploymentE2ETestHelpers.cs
@joperezr
Copy link
Member Author

Updated the merge commit to fix a dropped change from PR #14441: InstallAspireBundleFromPullRequest in CliE2ETestHelpers.cs was still pointing at the deleted get-aspire-cli-bundle-pr.{sh,ps1} scripts instead of the renamed get-aspire-cli-pr.{sh,ps1}. This was causing BundleSmokeTests and TypeScriptPolyglotTests to fail with a curl 404.

@joperezr joperezr merged commit 82f7a57 into main Feb 25, 2026
341 of 342 checks passed
@joperezr joperezr deleted the merge-release-13.2 branch February 25, 2026 03:46
@dotnet-policy-service dotnet-policy-service bot added this to the 13.3 milestone Feb 25, 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