Skip to content

Merge release/13.2 into main after 13.2.0 release#15540

Open
joperezr wants to merge 38 commits intomainfrom
merge/release-13.2-to-main
Open

Merge release/13.2 into main after 13.2.0 release#15540
joperezr wants to merge 38 commits intomainfrom
merge/release-13.2-to-main

Conversation

@joperezr
Copy link
Member

This PR merges the release/13.2 branch into main now that 13.2.0 has been released.

Note: This PR should be merged (not squashed) to preserve commit history.

joperezr and others added 30 commits March 17, 2026 19:57
…5323)

* Update package versions to 13.2.0 and enable stabilization in CI configuration

* Temporary marking some integrations as preview while we wait for Azure.Provisioning.PrivateDns package

* Update packaging service to set pre-release channel quality to 'Both' for pr hives

* Update CLI E2E version check to handle stabilized builds

When StabilizePackageVersion=true, aspire --version outputs just '13.2.0'
without a commit SHA suffix. Update VerifyAspireCliVersionAsync to check
for '13.2.0' which is present in both stable and prerelease version strings.
Suppress IDE0060 for the unused commitSha parameter rather than removing it,
so it can be restored when merging back to main.

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

* Skip preview-only packages in TypeScript polyglot validation

Packages with SuppressFinalPackageVersion=true only produce prerelease
versions, which causes aspire restore to fail when the build is stabilized
(it requests stable versions). Skip these packages until the build
infrastructure dynamically computes versions (#15335).

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ath to _appDirectoryPath/AppDirectoryPath in PrebuiltAppHostServer (#15332)

* Initial plan

* Remove Path.GetDirectoryName call and rename _appPath to _appDirectoryPath in PrebuiltAppHostServer

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

* Rename AppPath property to AppDirectoryPath in IAppHostServerProject and implementations

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>
* Fix Foundry run-mode project restart

Ensure the default Foundry ACR is registered in run mode so project provisioning can restore its dependent outputs on restart.

Add a regression test covering run-mode default container registry registration for Foundry projects.

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

* Update Foundry run-mode test expectation

Adjust the Foundry run-mode project test to expect the default container registry to be modeled in the app resources now that restart provisioning depends on it.

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

* Block Foundry projects on local mode

Throw a clear InvalidOperationException when AddProject is combined with RunAsFoundryLocal in either order, and add tests covering both unsupported scenarios.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix Aspire.Hosting analyzer hookup

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

* Fix analyzer export after rebase

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

* Remove global namespace qualifiers

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

* Refresh codegen snapshots

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

* Fix TypeScript capability assertions

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

* Fix shared configuration export ignore

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

* Address analyzer review feedback

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

* Refresh container capability snapshot

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

---------

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

* Consolidate WithEnvironment exports using AspireUnionAttribute

Merge the separate withEnvironment (string) and withEnvironmentExpression
(ReferenceExpression) polyglot exports into a single withEnvironment export
using [AspireUnion] to accept string | ReferenceExpression | EndpointReference.

This gives TypeScript AppHost users a single, clean API:
  await api.withEnvironment('KEY', 'value');
  await api.withEnvironment('KEY', refExpr`redis://${endpoint}`);
  await api.withEnvironment('KEY', endpoint);

Instead of requiring separate method names for each value type.

Also adds EndpointReference support which was previously unexported,
and handles object target type in AtsMarshaller.ConvertPrimitive for
correct union parameter deserialization.

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

* Expand WithEnvironment union with ParameterResource, ConnectionString, and IValueProvider fallback

- Add IResourceBuilder<ParameterResource> and IResourceBuilder<IResourceWithConnectionString> to the AspireUnion
- Add IValueProvider+IManifestExpressionProvider runtime fallback for extensibility (e.g. BicepOutputReference)
- Remove withEnvironmentEndpoint separate export (covered by union)
- Remove sync withEnvironmentCallback export, rename async to withEnvironmentCallback
- Update codegen snapshots

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

* Update TypeScript apphost environment usage

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

* Refresh polyglot codegen snapshots

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

* Add ReferenceExpression apphost coverage

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

* Fix TypeScript polyglot validation apphost

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

* Potential fix for pull request finding

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

* Potential fix for pull request finding

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

* Make WithEnvironment union overload internal

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

* Address WithEnvironment review feedback

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Fowler <davidfowl@gmail.com>
Co-authored-by: Sebastien Ros <sebastienros@gmail.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Add TypeScript SDK refresh workflow

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

* Address TypeScript SDK workflow review comments

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

---------

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

* Add installer paths to CI trigger patterns

* Replace channel with artifactVersion in Homebrew cask generation

Stable builds publish CLI archives under a preview version path on ci.dot.net
(e.g. aspire/9.2.0-preview.1.12345/) while the tarball filename uses the real
stable version (aspire-cli-osx-arm64-9.2.0.tar.gz). The old code assumed the
same version appeared in both the URL path and filename.

Introduce --artifact-version to generate-cask.sh so the URL path segment and
the filename version can differ. Add --archive-root for computing SHA256 hashes
from locally-built archives instead of downloading from ci.dot.net.

Remove the --channel parameter and the separate aspire@prerelease.rb.template;
only the stable aspire.rb template is used. Simplify dogfood.sh accordingly.

* Harden Homebrew prepare-stage validation

Add brew style --fix to auto-correct formatting before auditing. Detect whether
the cask is new upstream by querying the GitHub API and run brew audit with
--new when appropriate. Use HOMEBREW_NO_INSTALL_FROM_API=1 during install tests
to ensure the local tap cask is used rather than the Homebrew API cache.

Add proper cleanup traps for brew untap on exit. Make the install/uninstall
test conditional via a runInstallTest parameter. Write a validation-summary.json
artifact recording all check results so the publish step can verify that
prepare-stage validation actually ran and passed.

* Rewrite Homebrew publish to use GitHub REST and GraphQL API

Replace the gh CLI and git clone/push workflow with pure GitHub API calls via
Invoke-RestMethod. This removes the need for a git installation on the build
agent and avoids fork-clone race conditions.

Key changes:
- Fork Homebrew/homebrew-cask via API with polling for readiness
- Create/reset the PR branch and upload the cask file via the contents API
- Check whether upstream already has the exact same content and skip if so
- Require a passing validation-summary.json before submitting
- Create PRs as drafts; convert existing open PRs to draft via GraphQL
- Generate a rich PR body with a checklist of all validation steps
- Reference superseded closed PRs in the body when re-submitting

* Improve WinGet manifest generation and publishing

Apply the same artifactVersion split to the WinGet pipeline: the installer URL
path uses the artifact version while the package version uses the real stable
version. Update generate-manifests.ps1 and the prepare/publish templates
accordingly.

* Wire up artifactVersion in release and CI pipelines

Update the top-level pipeline files to pass artifactVersion instead of channel
to the Homebrew and WinGet templates. Add the new installer preparation and
publishing stages to the unofficial pipeline.

* Potential fix for pull request finding

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

* Address installer publishing review feedback

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

* [release/13.2] Fix Homebrew publish URI escaping

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

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…es (#15350)

* Improve CLI error messages for dependency and project creation failures

* Use Assert.Collection and Assert.Equal in NewCommandTests

* Fix DisplayLines markup test assertion
Add three context menu actions for endpoint URL tree items in the
Running AppHosts tree view:
- Copy URL to Clipboard
- Open in External Browser
- Open in Simple Browser

Introduces EndpointUrlItem TreeItem subclass with contextValue
'endpointUrl' to enable context menu targeting, replacing the
generic DetailItem for endpoint URLs.

Fixes #15345

Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add API Review Agent Skill

This skill allows us to automate parts of the API reviews that we do.

* updates - tag the original author in the comment

* Address PR review feedback on api-review skill

- Fix description to say 'developer who introduced each API (via git blame)'
  instead of 'PR author' to avoid misdirected attribution
- Replace broken gh api --jsonArray bash example with Python script using
  json.dump + gh api --input (--jsonArray is not a real gh flag)
- Provide non-empty review body instead of empty string to avoid API rejection

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

* Add deduplication check to api-review skill

Before posting review comments, the skill now checks for existing
API review comments by the current user on the PR. If found, it
skips duplicates, updates changed findings, and only posts net-new
findings. This prevents duplicate comments when the skill runs
against the same PR multiple times.

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

---------

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

* Fix legacy settings migration path adjustment

When migrating from .aspire/settings.json to aspire.config.json, the
appHostPath was copied verbatim. But .aspire/settings.json stores paths
relative to the .aspire/ directory (e.g., '../src/apphost.ts'), while
aspire.config.json stores paths relative to its own directory (the
project root). This caused the migrated path to resolve incorrectly.

The fix re-bases the appHostPath during migration: resolves it against
the legacy .aspire/ directory, then makes it relative to the config
directory. For example, '../src/apphost.ts' becomes 'src/apphost.ts'.

Includes unit tests for the path adjustment and an E2E test that
verifies the full migration scenario with a TypeScript apphost in a
subdirectory.

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

* Fix E2E test: use grep instead of terminal buffer check

The terminal buffer accumulates all output, so the earlier echo of
legacy settings.json content (containing '../src/apphost.ts') would
cause false matches when verifying the migrated aspire.config.json.

Use 'grep' with the exact JSON key-value pattern to isolate the check,
and rely on the host-side file verification as the primary assertion.

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

* Fix E2E test: keep TS project intact, use robust patterns

The previous test moved apphost.ts to src/ but left .modules/ in the
workspace root, breaking TS imports. aspire run couldn't start, so the
migration never triggered and aspire.config.json was never created.

Changes:
- Keep apphost.ts at workspace root (project stays valid)
- Test re-basing with '../apphost.ts' -> 'apphost.ts' instead
  (same code path as '../src/apphost.ts' -> 'src/apphost.ts')
- Wait for 'Press CTRL+C' or 'Apphost failed' instead of generic
  'ERR:' which could false-match shell prompt patterns

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

* Fix E2E test: poll host filesystem instead of parsing terminal

Previous approach failed because:
1. aspire run error messages varied by failure mode
2. Terminal buffer pattern matching was fragile across exit codes

Now polls the host-side filesystem via bind mount for aspire.config.json,
which is created during apphost discovery before the actual run attempt.
This works regardless of whether aspire run succeeds or fails.

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

* Address PR feedback: normalize separators, guard empty paths, add tests

- Normalize backslash separators to OS-native before Path operations,
  then always output forward slashes (matching storage convention)
- Guard against empty/whitespace paths to avoid converting '' to '.'
- Use { Length: > 0 } pattern match instead of separate null check
- Rename misleading test to clarify .aspire/-relative semantics
- Add tests: backslash normalization, output always uses '/',
  deeply nested paths, empty path preservation, null path handling

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

* Replace unrealistic test with realistic subdirectory path scenario

The previous test used 'apphost.ts' without '../' prefix, which would
mean the apphost lives inside .aspire/ — an impossible real-world
scenario. Replace with a realistic .csproj-in-subdirectory case:
'../MyApp.AppHost/MyApp.AppHost.csproj' -> 'MyApp.AppHost/MyApp.AppHost.csproj'

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

* Use PathNormalizer for migration path re-basing

Replace manual slash normalization + GetFullPath with the existing
PathNormalizer.NormalizePathForCurrentPlatform() utility, which does
the same thing in one call.

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

* Add NormalizePathForStorage helper and additional path tests

Address review feedback:
- Extract PathNormalizer.NormalizePathForStorage() for the common
  backslash-to-forward-slash normalization used when persisting paths.
- Add tests for ./path, bare relative path, Unix rooted, and Windows
  rooted legacy migration scenarios.

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

* Use realistic paths in migration tests

Avoid test paths that imply apphost lives under .aspire/ since that
never happens in practice.

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>
* Secure AppHost RPC with session token handshake

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

* Fix TypeScript RPC authentication request

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

* Address AppHost RPC auth review feedback

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

* Update SDKs with token checks

* Move scoped registrations to correct location

* Consolidate temporary AppHost sessions

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

* Address PR review feedback

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

* Fix CI regressions after branch drift

Sync the AppHost server project contract with current release/13.2 and make the RemoteHost authentication test tolerate the expected disconnect race after failed auth.

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

---------

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

* Clean up Aspire panel: context menus, loading state, welcome messages

Adds initial 'loading' screen, new context menus for resources, endpoints,
apphost, and PID nodes. Consolidates previous 3 commits into one for clean
rebase onto main.

* remove unused strings

* remove comands on resources node, update string
Use stable Azure.Provisioning.PrivateDns and remove SuppressFinalPackageVersion on these two packages so they ship stable.

Fix #15328
* Fix brittle CPM CLI E2E test

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

* Harden CPM E2E prompt handling

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>
* API Review Feedback

Fixing some API review comments.

* Remove unused attribute.
* Use home-based CLI cache and socket paths

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

* Share CLI identifier hashing helpers

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

* Add legacy backchannel hash fallback

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

* Align CLI socket and NuGet helpers

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

* Update src/Shared/BackchannelConstants.cs

Co-authored-by: James Newton-King <james@newtonking.com>

* Remove unshipped SHA socket fallback

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

* Revert NuGet cache relocation

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

* Simplify CliPathHelper

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: James Newton-King <james@newtonking.com>
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
* Fix dashboard GHCP

* Add comment

* Fix dashboard tests for non-nullable resourceName parameter

* Apply suggestions from code review

Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>

---------

Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
* Mark code generation packages as preview

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

* Mark code generation packages experimental

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

* Internalize code generation implementations

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Include packages/restore in aspire cache clear

The cache clear command was not clearing ~/.aspire/packages/ which contains
restored NuGet packages for apphost server sessions. When the CLI binary is
updated but the cached DLLs have the same version string, stale packages
persist and cause failures (e.g. missing auth handshake in transport.ts).

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

* Address review feedback: extract helper, use EnumerateFiles, add tests

- Extract ClearDirectoryContents helper to deduplicate directory-clearing logic
- Use EnumerateFiles with IgnoreInaccessible instead of GetFiles to handle
  inaccessible paths gracefully during enumeration
- Add tests for packages directory clearing, skip predicate, null/nonexistent
  directory handling

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

* Fix test: use WorkspaceRoot instead of WorkingDirectory

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Microsoft.Bcl.Memory 10.0.0 has a known high severity vulnerability
(GHSA-73j8-2gch-69rq) - a denial of service via out-of-bounds read
when decoding malformed Base64Url input. Update to 10.0.5 which
includes the fix.

Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add CodeLens and gutter decoration support for AppHost resources

* wip

* remove status bar strings from branch

* Add CodeLens, gutter decorations, and AppHost resource parsers for VS Code extension

- Add CodeLens provider showing resource state, actions (start/stop/restart), and view logs
- Add gutter decoration provider with colored status circles for resources
- Add C# and JS/TS AppHost resource parsers with registry pattern
- Add statementStartLine for multi-line fluent chain CodeLens positioning
- Add comment-skipping logic so CodeLens appears below comments, above code
- Extract shared resource state utilities and resource constants
- Add enableCodeLens and enableGutterDecorations settings
- Add comprehensive test coverage (parsers, CodeLens, resourceStateUtils)
- Only match parent resources (Add* calls), not implicit child resources (With* calls)

* Address Copilot review: conditional appHostPath, displayName preference, Unhealthy as error

- Guard --apphost flag when appHostPath is falsy in CodeLens commands
- Prefer displayName over name in two-pass resource matching
- Classify Unhealthy health status as error (not warning) to align with tree view

* bump extension version

* update config json
* Stabilize Aspire.Hosting.Docker package

Remove SuppressFinalPackageVersion to make the package ship as a stable
release. Add DisablePackageBaselineValidation since this is the first
stable version and there is no prior baseline to validate against.

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

* Fix tests for stable version

---------

Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
We shouldn't default to ~/.nuget/packages. Instead we should use NuGet defaulting logic.

Fix #15404

Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
…ectory (#15415)

* [release/13.2] Store temporary AppHost service under user .aspire directory

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

* Update tests/Aspire.Cli.Tests/Projects/PrebuiltAppHostServerTests.cs

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

* Update tests/Aspire.Cli.Tests/Projects/PrebuiltAppHostServerTests.cs

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

* [release/13.2] Address PR review feedback

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>
…15383)

When 'aspire config set features.X true' writes a JSON string "true" instead
of a JSON boolean, AspireConfigFile.Load() fails to deserialize the
Dictionary<string, bool> Features property.

Fix by adding a FlexibleBooleanConverter that tolerates both JSON booleans and
JSON string representations of booleans. The converter is registered globally
via JsonSourceGenerationOptions.Converters so all bool properties benefit.

Also fix TryNormalizeSettingsFile to use DeepClone() instead of ToString()
when normalizing colon-separated keys, which was corrupting non-string types.

Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…config.json to .NET templates (#15423)

* Add E2E test: config discovery from apphost directory

Adds a test that verifies aspire.config.json is discovered adjacent
to the apphost file when running from a parent directory, rather than
being recreated in the current working directory.

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

* Fix config discovery to search from apphost directory

When an apphost is found via recursive search, use its directory as the
search root for aspire.config.json (walking upward) instead of defaulting
to CWD. This prevents creating a duplicate config when the user runs
'aspire run' from a parent directory after 'aspire new'.

Changes:
- Add ConfigurationHelper.FindNearestConfigFilePath helper
- ProjectLocator.CreateSettingsFileAsync: skip creation when config
  already exists near the apphost with valid appHost.path
- GuestAppHostProject.GetConfigDirectory: search from apphost directory
  so launch profiles are read from the correct config

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

* Fix: only skip config creation when path matches discovered apphost

The previous check skipped creation whenever any appHost.path existed,
which broke config healing when the path was stale/invalid. Now we
resolve the stored path and only skip if it points to the same apphost
that was discovered via recursive search.

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

* Add aspire.config.json to .NET apphost templates

Include aspire.config.json with appHost.path in the aspire-apphost
(csproj) and aspire-apphost-singlefile templates so that aspire run
from a parent directory finds the config adjacent to the apphost
instead of creating a spurious one in the working directory.

The csproj template uses sourceName 'Aspire.AppHost1' so the template
engine substitutes the actual project name automatically.

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

* Add aspire.config.json to solution-level apphost templates

Add aspire.config.json at the solution root for aspire-empty,
aspire-starter, and aspire-ts-cs-starter templates. Each points to
the AppHost csproj via a relative path. The template engine
substitutes the sourceName so the path matches the actual project
name chosen by the user.

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

* Add aspire.config.json to aspire-py-starter template

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

* Address review feedback: fix legacy path handling, stale docs, dead code

- Fix legacy .aspire/settings.json path handling in ProjectLocator:
  resolve config root to parent of .aspire/ directory
- Update GetConfigDirectory XML doc to reflect new behavior
- Remove unused _configurationService field and constructor parameter
- Assert originalContent == currentContent in E2E test

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 Windows CLI backchannel socket path

* Respond to PR feedback

When using named pipes for the Guest AppHost, we need to just return a name, not a path.
sebastienros and others added 4 commits March 21, 2026 11:14
…crosoft (#15466)

* Update all dotnet/aspire references to microsoft/aspire

Updated all GitHub Actions workflow owner guards from
repository_owner == 'dotnet' to repository_owner == 'microsoft'
across 24 workflow files.

Replaced all dotnet/aspire repository references with microsoft/aspire
across 288 files including workflows, scripts, tests, READMEs, source
code, templates, and documentation. Preserved aka.ms short links
pointing to dotnet/aspire as those are external redirects.

Fixed SigstoreNpmProvenanceCheckerTests expectedOwner to match the
updated URL.

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

* Use GitHub App token for PR creation in all workflows

The microsoft org disables GITHUB_TOKEN from creating PRs. This updates
all 10 workflows that create PRs to use a GitHub App installation token
(via actions/create-github-app-token) instead.

- 9 workflows: add app token step, pass to existing PR creation logic
- backport: rewrite locally (arcade reusable workflow doesn't accept
  custom tokens), filed dotnet/arcade#16585 for upstream support
- release-github-tasks: also fix head: -> branch: bug in PR creation

Replicates changes from microsoft/aspire-internal-reorg-temp#10.

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

* Apply remaining microsoft/aspire updates for release/13.2

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

---------

Co-authored-by: Jose Perez Rodriguez <joperezr@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Quarantine Docker and Kubernetes E2E tests on release/13.2

SuppressFinalPackageVersion=true packages get assembly version 42.42.42.42
while stable packages resolve from nuget.org with 13.2.0.0, causing CS1705
and NU1102 errors on release branches.

Tracking issue: #15511

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

* Add missing 'using Aspire.TestUtilities' for QuarantinedTest attribute

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Tighten Kusto emulator functional log assertions (#15473)

* Tighten Kusto functional log assertions

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

* Document Kusto log assertion source

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

* Assert Kusto failure log message

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

* Fix Kusto assertion analyzer warning

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

* Re-enable Kusto Linux tests

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

* Relax Kusto invalid log assertion

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

* Strengthen Kusto failure log assertions

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

* Relax Kusto exception assertion

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

* Reduce Cosmos emulator test footprint

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

* Scope Cosmos wait test health checks

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

* Harden Cosmos emulator readiness

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

* Pin classic Cosmos emulator image

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

* Use Cosmos emulator 2.14.26

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

* Use stable Cosmos emulator image

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
(cherry picked from commit 75c45a3)

* Adjust Cosmos emulator tag test for stable backport

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

* Pin Kusto emulator image on release/13.2

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

---------

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

github-actions bot commented Mar 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/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 15540

Or

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

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 back into main after the 13.2.0 release, carrying forward release-branch fixes and infrastructure updates into the mainline.

Changes:

  • Adds/updates RemoteHost JSON-RPC authentication (token-based) and regenerates polyglot transports/snapshots accordingly.
  • Improves CLI filesystem/layout behavior (stable ~/.aspire paths, packages directory support, cache clearing, settings migration behavior) and extends test coverage.
  • Updates engineering pipelines and packaging artifacts (WinGet/Homebrew manifest/version handling), plus template/config/link refreshes.

Reviewed changes

Copilot reviewed 218 out of 220 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
tests/helix/send-to-helix-inner.proj Updates repo links in Helix comments.
tests/Aspire.Hosting.RemoteHost.Tests/CodeGenerationResolverTests.cs Adds resolver discovery tests for internal generators/support.
tests/Aspire.Hosting.RemoteHost.Tests/AttributeDataReaderTests.cs Adds test coverage for type-level AspireExportIgnore.
tests/Aspire.Hosting.RemoteHost.Tests/Aspire.Hosting.RemoteHost.Tests.csproj Adds references to codegen projects for resolver tests.
tests/Aspire.Hosting.Foundry.Tests/ProjectResourceTests.cs Updates run-mode registry expectations.
tests/Aspire.Hosting.Foundry.Tests/AddProjectTests.cs Adds ordering/invalid-combination tests for Foundry local + projects.
tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/transport.verified.ts Updates TS transport snapshot for authentication.
tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/HostingContainerResourceCapabilities.verified.txt Updates capability IDs/names snapshot after export changes.
tests/Aspire.Hosting.CodeGeneration.TypeScript.JsTests/tests/transport.test.ts Adds JS tests asserting auth token behavior during connect.
tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/AtsGeneratedAspire.verified.rs Updates Rust snapshot to authenticate after connect.
tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/AtsGeneratedAspire.verified.py Updates Python snapshot to authenticate after connect.
tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/AtsGeneratedAspire.verified.java Updates Java snapshot to authenticate after connect.
tests/Aspire.Hosting.CodeGeneration.Java.Tests/AtsJavaCodeGeneratorTests.cs Asserts token param list generation in Transport.java.
tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/AtsGeneratedAspire.verified.go Updates Go snapshot to authenticate after connect.
tests/Aspire.Hosting.Azure.Tests/FoundryExtensionsTests.cs Adds run-mode default container registry test.
tests/Aspire.Hosting.Azure.Tests/AzureCosmosDBExtensionsTests.cs Updates expected Cosmos emulator tag default to stable.
tests/Aspire.Hosting.Azure.Kusto.Tests/AddAzureKustoTests.cs Updates expected Kusto emulator tag default to pinned tag.
tests/Aspire.Dashboard.Tests/Model/AIAssistant/AssistantChatDataContextTests.cs Adjusts tests for non-nullable resourceName parameters.
tests/Aspire.Cli.Tests/Utils/CliTestHelper.cs Wires packages directory into CLI execution context for tests.
tests/Aspire.Cli.Tests/Utils/CliPathHelperTests.cs Adds tests for randomized socket path generation.
tests/Aspire.Cli.Tests/Utils/AppHostHelperTests.cs Adds compatibility tests for previous/current aux socket formats.
tests/Aspire.Cli.Tests/Projects/PrebuiltAppHostServerTests.cs Adds test ensuring working dir is under user Aspire home.
tests/Aspire.Cli.Tests/Projects/GuestAppHostProjectTests.cs Simplifies helper creation; adjusts config service setup.
tests/Aspire.Cli.Tests/Projects/AppHostServerSessionTests.cs Adds test ensuring env var dictionary isn’t mutated by session start.
tests/Aspire.Cli.Tests/Projects/AppHostServerProjectTests.cs Tests project model path hashing under ~/.aspire/hosts.
tests/Aspire.Cli.Tests/Packaging/PackagingServiceTests.cs Minor assertion refactor for global packages folder value.
tests/Aspire.Cli.Tests/Interaction/ConsoleInteractionServiceTests.cs Updates escaping expectation for Spectre markup rendering.
tests/Aspire.Cli.Tests/DotNetSdkInstallerTests.cs Updates minimum SDK error message expected string.
tests/Aspire.Cli.Tests/Configuration/ConfigurationServiceTests.cs Adds tests ensuring boolean-like strings remain JSON strings.
tests/Aspire.Cli.Tests/Configuration/ConfigurationHelperTests.cs Adds normalization test preserving boolean JSON types.
tests/Aspire.Cli.Tests/Commands/NewCommandTests.cs Adds tests ensuring “could not be created” error is displayed.
tests/Aspire.Cli.Tests/Commands/InitCommandTests.cs Adds tests ensuring “could not be created” error is displayed.
tests/Aspire.Cli.Tests/Commands/CacheCommandTests.cs Adds tests for clearing packages dir and directory delete helper.
tests/Aspire.Cli.EndToEnd.Tests/LocalConfigMigrationTests.cs Adds E2E test for migrating legacy settings relative paths.
tests/Aspire.Cli.EndToEnd.Tests/Helpers/CliE2EAutomatorHelpers.cs Adjusts CLI version verification for stabilized builds.
src/Shared/PathNormalizer.cs Adds storage normalization (backslash → forward slash).
src/Shared/KnownConfigNames.cs Adds ASPIRE_REMOTE_APPHOST_TOKEN constant.
src/Shared/IConfigurationExtensions.cs Adds export-ignore attribute stubs for CLI/Dashboard builds.
src/Directory.Build.targets Broadens condition for analyzer project reference inclusion.
src/Aspire.TypeSystem/AttributeDataReader.cs Adds HasAspireExportIgnoreData(Type) helper.
src/Aspire.ProjectTemplates/templates/aspire-ts-cs-starter/frontend/src/App.tsx Updates GitHub link to microsoft org.
src/Aspire.ProjectTemplates/templates/aspire-ts-cs-starter/aspire.config.json Adds default template aspire.config.json.
src/Aspire.ProjectTemplates/templates/aspire-starter/aspire.config.json Adds default template aspire.config.json.
src/Aspire.ProjectTemplates/templates/aspire-py-starter/frontend/src/App.tsx Updates GitHub link to microsoft org.
src/Aspire.ProjectTemplates/templates/aspire-py-starter/aspire.config.json Adds default template aspire.config.json.
src/Aspire.ProjectTemplates/templates/aspire-empty/aspire.config.json Adds default template aspire.config.json.
src/Aspire.ProjectTemplates/templates/aspire-apphost/aspire.config.json Adds default template aspire.config.json.
src/Aspire.ProjectTemplates/templates/aspire-apphost-singlefile/aspire.config.json Adds default template aspire.config.json.
src/Aspire.Managed/NuGet/Commands/RestoreCommand.cs Uses NuGet settings to resolve global packages folder.
src/Aspire.Hosting/Utils/ExtensionUtils.cs Marks helper as AspireExportIgnore to reduce ATS surface.
src/Aspire.Hosting/Publishing/PublishingExtensions.cs Marks convenience wrappers as AspireExportIgnore.
src/Aspire.Hosting/ProjectResourceBuilderExtensions.cs Runs selected exports sync ops on background thread.
src/Aspire.Hosting/Polyglot/PolyglotLanguages.cs Removes legacy polyglot language enum.
src/Aspire.Hosting/Polyglot/PolyglotIgnoreAttribute.cs Removes legacy polyglot ignore attribute.
src/Aspire.Hosting/ExecutableResourceExtensions.cs Marks model inspection helper as AspireExportIgnore.
src/Aspire.Hosting/ExecutableResourceBuilderExtensions.cs Updates export metadata for docker publish helper.
src/Aspire.Hosting/EmulatorResourceExtensions.cs Marks model inspection helper as AspireExportIgnore.
src/Aspire.Hosting/Dashboard/proto/dashboard_service.proto Updates issue links to microsoft org.
src/Aspire.Hosting/ContainerResourceExtensions.cs Marks model inspection helpers as AspireExportIgnore.
src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs Renames export IDs for parameter-based build arg/secret overloads.
src/Aspire.Hosting/ContainerExecutableResourceExtensions.cs Marks model inspection helper as AspireExportIgnore.
src/Aspire.Hosting/ConnectionStringBuilderExtensions.cs Runs export sync op on background thread.
src/Aspire.Hosting/ConnectionPropertiesExtensions.cs Marks connection-property merge helper as AspireExportIgnore.
src/Aspire.Hosting/Ats/AspireExportIgnoreAttribute.cs Allows applying ignore at type level.
src/Aspire.Hosting/Aspire.Hosting.csproj Removes redundant analyzer project reference (now via targets).
src/Aspire.Hosting/ApplicationModel/ProjectResourceExtensions.cs Marks model inspection helpers as AspireExportIgnore.
src/Aspire.Hosting/ApplicationModel/DistributedApplicationModelExtensions.cs Marks model inspection helpers as AspireExportIgnore.
src/Aspire.Hosting.RemoteHost/RemoteHostServer.cs Makes core services scoped per client; adds auth state.
src/Aspire.Hosting.RemoteHost/RemoteAppHostService.cs Adds authenticate RPC and enforces auth for methods.
src/Aspire.Hosting.RemoteHost/Language/LanguageService.cs Enforces auth before language RPC methods.
src/Aspire.Hosting.RemoteHost/JsonRpcServer.cs Uses scoped services per connection and sets client connection.
src/Aspire.Hosting.RemoteHost/JsonRpcAuthenticationState.cs Adds token verification state for RPC sessions.
src/Aspire.Hosting.RemoteHost/CodeGeneration/CodeGenerationService.cs Enforces auth before codegen RPC methods.
src/Aspire.Hosting.RemoteHost/AtsCapabilityScanner.cs Treats type-level ignore as ignoring member exports.
src/Aspire.Hosting.RemoteHost/Ats/AtsMarshaller.cs Improves union object unmarshalling based on JSON shape.
src/Aspire.Hosting.RemoteHost/Aspire.Hosting.RemoteHost.csproj Links shared KnownConfigNames into RemoteHost.
src/Aspire.Hosting.Foundry/Project/ProjectBuilderExtension.cs Blocks projects under local-emulator Foundry; always adds ACR.
src/Aspire.Hosting.Foundry/FoundryModel.Generated.cs Updates model metadata (new models/summary tweaks).
src/Aspire.Hosting.Foundry/FoundryExtensions.cs Adds shared exception message and ordering guard.
src/Aspire.Hosting.Docker/Aspire.Hosting.Docker.csproj Adjusts package baseline validation setting.
src/Aspire.Hosting.CodeGeneration.TypeScript/TypeScriptLanguageSupport.cs Makes language support internal.
src/Aspire.Hosting.CodeGeneration.TypeScript/Resources/transport.ts Adds auth handshake during connect.
src/Aspire.Hosting.CodeGeneration.TypeScript/AtsTypeScriptCodeGenerator.cs Makes generator internal.
src/Aspire.Hosting.CodeGeneration.TypeScript/AssemblyInfo.cs Marks assembly as Experimental(ASPIREATS001).
src/Aspire.Hosting.CodeGeneration.Rust/RustLanguageSupport.cs Makes language support internal.
src/Aspire.Hosting.CodeGeneration.Rust/Resources/transport.rs Adds authenticate method to transport.
src/Aspire.Hosting.CodeGeneration.Rust/AtsRustCodeGenerator.cs Makes generator internal; generates auth usage.
src/Aspire.Hosting.CodeGeneration.Rust/AssemblyInfo.cs Marks assembly as Experimental(ASPIREATS001).
src/Aspire.Hosting.CodeGeneration.Python/Resources/transport.py Adds authenticate method to transport.
src/Aspire.Hosting.CodeGeneration.Python/PythonLanguageSupport.cs Makes language support internal.
src/Aspire.Hosting.CodeGeneration.Python/AtsPythonCodeGenerator.cs Makes generator internal; generates auth usage.
src/Aspire.Hosting.CodeGeneration.Python/AssemblyInfo.cs Marks assembly as Experimental(ASPIREATS001).
src/Aspire.Hosting.CodeGeneration.Java/Resources/Transport.java Adds authenticate request support.
src/Aspire.Hosting.CodeGeneration.Java/JavaLanguageSupport.cs Makes language support internal.
src/Aspire.Hosting.CodeGeneration.Java/AtsJavaCodeGenerator.cs Makes generator internal; generates auth usage.
src/Aspire.Hosting.CodeGeneration.Java/AssemblyInfo.cs Marks assembly as Experimental(ASPIREATS001).
src/Aspire.Hosting.CodeGeneration.Go/Resources/transport.go Adds Authenticate method to transport.
src/Aspire.Hosting.CodeGeneration.Go/GoLanguageSupport.cs Makes language support internal.
src/Aspire.Hosting.CodeGeneration.Go/AtsGoCodeGenerator.cs Makes generator internal; generates auth usage.
src/Aspire.Hosting.CodeGeneration.Go/AssemblyInfo.cs Marks assembly as Experimental(ASPIREATS001).
src/Aspire.Hosting.Azure.WebPubSub/AzureWebPubSubResource.cs Removes redundant explicit private endpoint Id impl.
src/Aspire.Hosting.Azure.Sql/AzureSqlServerResource.cs Removes redundant explicit private endpoint Id impl / using.
src/Aspire.Hosting.Azure.SignalR/AzureSignalRResource.cs Removes redundant explicit private endpoint Id impl.
src/Aspire.Hosting.Azure.ServiceBus/AzureServiceBusResource.cs Removes redundant explicit private endpoint Id impl.
src/Aspire.Hosting.Azure.Search/AzureSearchResource.cs Removes redundant explicit private endpoint Id impl.
src/Aspire.Hosting.Azure.Redis/AzureManagedRedisResource.cs Removes redundant explicit private endpoint Id impl.
src/Aspire.Hosting.Azure.PostgreSQL/AzurePostgresFlexibleServerResource.cs Removes redundant explicit private endpoint Id impl.
src/Aspire.Hosting.Azure.Network/IAzurePrivateEndpointTargetNotification.cs Moves namespace to Aspire.Hosting.Azure.
src/Aspire.Hosting.Azure.Network/AzurePrivateEndpointExtensions.cs Cleans up using after namespace move.
src/Aspire.Hosting.Azure.Kusto/AzureKustoEmulatorContainerImageTags.cs Pins emulator image tag to specific build.
src/Aspire.Hosting.Azure.KeyVault/AzureKeyVaultResource.cs Removes redundant explicit private endpoint Id impl.
src/Aspire.Hosting.Azure.EventHubs/AzureEventHubsResource.cs Removes redundant explicit private endpoint Id impl.
src/Aspire.Hosting.Azure.CosmosDB/AzureCosmosDBResource.cs Removes redundant explicit private endpoint Id impl.
src/Aspire.Hosting.Azure.AppConfiguration/AzureAppConfigurationResource.cs Removes redundant explicit private endpoint Id impl.
src/Aspire.Hosting.Analyzers/Infrastructure/WellKnownTypeData.cs Adds ValueTask/ValueTask as well-known types.
src/Aspire.Dashboard/wwwroot/css/app.css Updates issue link to microsoft org.
src/Aspire.Dashboard/Model/Assistant/AssistantChatViewModel.cs Updates default AI model list to include gpt-5.4.
src/Aspire.Dashboard/Model/Assistant/AssistantChatDataContext.cs Makes resourceName non-nullable to affect schema shape.
src/Aspire.Cli/Utils/ConfigurationHelper.cs Adds nearest-config search and preserves JSON value types on normalize.
src/Aspire.Cli/Utils/CliPathHelper.cs Adds centralized CLI path + socket path creation helpers.
src/Aspire.Cli/Utils/AppHostHelper.cs Updates docs/logic for current/previous socket name formats.
src/Aspire.Cli/Templating/Templates/ts-starter/frontend/src/App.tsx Updates GitHub link to microsoft org.
src/Aspire.Cli/Scaffolding/ScaffoldingService.cs Uses AppHostServerSession abstraction (auth + cleanup).
src/Aspire.Cli/Resources/xlf/InteractionServiceStrings.*.xlf Adds new localized string entry placeholder.
src/Aspire.Cli/Resources/xlf/ErrorStrings.*.xlf Updates MinimumSdkVersionNotMet source across locales.
src/Aspire.Cli/Resources/InteractionServiceStrings.resx Adds ProjectCouldNotBeCreated string.
src/Aspire.Cli/Resources/InteractionServiceStrings.Designer.cs Adds accessor for ProjectCouldNotBeCreated.
src/Aspire.Cli/Resources/ErrorStrings.resx Updates MinimumSdkVersionNotMet English source string.
src/Aspire.Cli/Projects/ProjectUpdater.cs Fixes named argument for cancellationToken parameter.
src/Aspire.Cli/Projects/ProjectLocator.cs Avoids overwriting config if a nearby config already points to apphost.
src/Aspire.Cli/Projects/PrebuiltAppHostServer.cs Renames AppPath to AppDirectoryPath; uses ~/.aspire working dir.
src/Aspire.Cli/Projects/IAppHostServerSession.cs Adds AuthenticationToken property.
src/Aspire.Cli/Projects/IAppHostServerProject.cs Renames AppPath to AppDirectoryPath.
src/Aspire.Cli/Projects/IAppHostRpcClient.cs Requires authentication token on ConnectAsync.
src/Aspire.Cli/Projects/DotNetBasedAppHostServerProject.cs Moves project model path under ~/.aspire/hosts.
src/Aspire.Cli/Projects/AppHostServerSession.cs Adds server start helper injecting auth token; authenticates client.
src/Aspire.Cli/Projects/AppHostServerProject.cs Uses CliPathHelper for randomized guest socket paths.
src/Aspire.Cli/Projects/AppHostRpcClient.cs Adds auth handshake on connect; updates factory signature.
src/Aspire.Cli/Program.cs Centralizes Aspire home and adds packages directory to execution context.
src/Aspire.Cli/Packaging/PackagingService.cs Marks PR channels as quality Both.
src/Aspire.Cli/JsonSourceGenerationContext.cs Adds FlexibleBooleanConverter to source-gen options.
src/Aspire.Cli/Interaction/ConsoleInteractionService.cs Adjusts line rendering and single-stderr-line behavior.
src/Aspire.Cli/DotNet/DotNetCliRunner.cs Uses CliPathHelper for backchannel socket path creation.
src/Aspire.Cli/Configuration/FlexibleBooleanConverter.cs Adds converter accepting bool or boolean strings.
src/Aspire.Cli/Configuration/AspireConfigFile.cs Rebases legacy relative appHostPath during migration and normalizes separators.
src/Aspire.Cli/Commands/Sdk/SdkGenerateCommand.cs Uses AppHostServerSession for SDK generation flow.
src/Aspire.Cli/Commands/Sdk/SdkDumpCommand.cs Uses AppHostServerSession for capability dump flow.
src/Aspire.Cli/Commands/NewCommand.cs Adds “could not be created” error message on failures.
src/Aspire.Cli/Commands/InitCommand.cs Adds “could not be created” error message on failures.
src/Aspire.Cli/Commands/CacheCommand.cs Clears packages dir and refactors deletion logic into helper.
src/Aspire.Cli/CliExecutionContext.cs Adds PackagesDirectory to execution context.
src/Aspire.Cli/Aspire.Cli.csproj Adds TokenGenerator shared file and System.IO.Hashing dependency.
playground/polyglot/TypeScript/Aspire.Hosting/ValidationAppHost/apphost.ts Updates TS validation apphost calls to new exports.
playground/polyglot/TypeScript/Aspire.Hosting.SqlServer/aspire.config.json Adds profiles section.
playground/TypeScriptApps/RpsArena/aspire.config.json Adds profiles section.
playground/TestShop/MyFrontend/Components/Layout/AppFooter.razor Updates GitHub links to microsoft org.
playground/FoundryAgentEnterprise/frontend/src/App.tsx Updates GitHub link to microsoft org.
eng/winget/microsoft.aspire/Aspire.locale.en-US.yaml.template Updates support/license URLs to microsoft org.
eng/winget/microsoft.aspire.prerelease/Aspire.locale.en-US.yaml.template Updates support/license URLs to microsoft org.
eng/winget/README.md Updates artifact URL template to use ARTIFACT_VERSION.
eng/testing/github-ci-trigger-patterns.txt Adds winget/homebrew paths to CI trigger patterns list.
eng/pipelines/templates/publish-winget.yml Copies “clean” manifest set and validates required manifests.
eng/pipelines/templates/prepare-winget-manifest.yml Adds artifactVersion support and conditional install test.
eng/pipelines/azure-pipelines.yml Adds clean checkout, computes artifact version, refines installer gating.
eng/homebrew/dogfood.sh Simplifies stable-only cask handling + conflict detection.
eng/homebrew/aspire@prerelease.rb.template Removes prerelease cask template.
eng/homebrew/aspire.rb.template Uses ARTIFACT_VERSION in URL and updates metadata.
eng/homebrew/README.md Updates docs for stable-only flow and revised publishing behavior.
eng/Versions.props Updates Microsoft.Extensions.AI.OpenAI version.
Directory.Packages.props Updates Azure.Provisioning, PrivateDns, and OpenAI package versions.
AGENTS.md Adds api-review skill documentation.
.github/workflows/refresh-typescript-sdks.yml Adds scheduled workflow to refresh TS playground SDKs.
.github/workflows/polyglot-validation/test-typescript-playground.sh Skips preview-only packages under stabilized builds; reports skipped count.
Files not reviewed (1)
  • src/Aspire.Cli/Resources/InteractionServiceStrings.Designer.cs: Language not supported

Comment on lines +44 to +49
var providedTokenBytes = Encoding.UTF8.GetBytes(token);

try
{
var isMatch = CryptographicOperations.FixedTimeEquals(providedTokenBytes, _expectedTokenBytes);

Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

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

CryptographicOperations.FixedTimeEquals throws if the input buffers are different lengths. If a client provides a token of a different length than the expected token, this method will throw instead of returning false, potentially turning failed authentication into an unhandled exception / DoS. Consider checking providedTokenBytes.Length == _expectedTokenBytes.Length before calling FixedTimeEquals (returning false when lengths differ) and still zeroing the provided buffer.

Copilot uses AI. Check for mistakes.
Comment on lines 49 to 85
@@ -81,7 +81,7 @@ public async Task GetTraces_ExceedTokenLimit_ReturnMostRecentItems()
var dataContext = CreateAssistantChatDataContext(telemetryRepository: repository);

// Act
var result = await dataContext.GetTracesAsync(resourceName: null, CancellationToken.None);
var result = await dataContext.GetTracesAsync(resourceName: null!, CancellationToken.None);

Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

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

These tests now pass null! for resourceName even though the API was intentionally changed to take a non-nullable string (to influence the generated JSON schema). To keep the tests aligned with the intended contract, pass an explicit “missing value” representation (e.g., string.Empty) instead of null!.

Copilot uses AI. Check for mistakes.
Comment on lines 125 to 128
<trans-unit id="MinimumSdkVersionNotMet">
<source>The Aspire CLI requires .NET SDK version {0} or later. Detected: {1}.</source>
<target state="translated">Die Aspire-CLI erfordert .NET SDK-Version {0} oder höher. Erkannt: {1}.</target>
<source>C# apphost requires .NET SDK version {0} or later. Detected: {1}.</source>
<target state="needs-review-translation">Die Aspire-CLI erfordert .NET SDK-Version {0} oder höher. Erkannt: {1}.</target>
<note />
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

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

The source string changed from “Aspire CLI requires …” to “C# apphost requires …”, but the localized <target> text still refers to the Aspire CLI. This will display an incorrect message for this locale. Until a proper translation is available, consider updating the <target> to match the new source text (or an accurate translation).

Copilot uses AI. Check for mistakes.
@github-actions
Copy link
Contributor

Re-running the failed jobs in the CI workflow for this pull request because 1 job was identified as retry-safe transient failures in the CI run attempt.
GitHub was asked to rerun all failed jobs for that attempt, and the rerun is being tracked in the rerun attempt.
The job links below point to the failed attempt jobs that matched the retry-safe transient failure rules.

Read VersionPrefix dynamically from eng/Versions.props instead of
hardcoding a specific version. For non-stabilized builds (all normal
PR builds), also verify the commit SHA suffix for exact build identity.

This replaces the hardcoded '13.2.0' check that was added on the
release/13.2 branch and would fail when merged to main (13.3.0).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Mitch Denny and others added 3 commits March 25, 2026 12:29
…ync)

Take main's version which includes the newer _agentInitCommand.PromptAndChainAsync
pattern, replacing release/13.2's simpler error check.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
On main, NewCommand no longer displays ProjectCouldNotBeCreated when
template apply fails — it delegates to PromptAndChainAsync which just
returns the exit code. Update tests from release/13.2 to match:

- C# test: expect DotNetTemplateFactory's ProjectCreationFailed message
- TypeScript test: just verify non-zero exit code (no error displayed)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Same class of merge issue: test from release/13.2 expected
ProjectCouldNotBeCreated error which NewCommand no longer displays
on main (replaced by PromptAndChainAsync). Remove the second error
assertion since only the aspire-restore failure message is displayed.

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

🎬 CLI E2E Test Recordings — 51 recordings uploaded (commit d91a347)

View recordings
Test Recording
AddPackageInteractiveWhileAppHostRunningDetached ▶️ View Recording
AddPackageWhileAppHostRunningDetached ▶️ View Recording
AgentCommands_AllHelpOutputs_AreCorrect ▶️ View Recording
AgentInitCommand_DefaultSelection_InstallsSkillOnly ▶️ View Recording
AgentInitCommand_MigratesDeprecatedConfig ▶️ View Recording
AspireAddPackageVersionToDirectoryPackagesProps ▶️ View Recording
AspireUpdateRemovesAppHostPackageVersionFromDirectoryPackagesProps ▶️ View Recording
Banner_DisplayedOnFirstRun ▶️ View Recording
Banner_DisplayedWithExplicitFlag ▶️ View Recording
CertificatesClean_RemovesCertificates ▶️ View Recording
CertificatesTrust_WithNoCert_CreatesAndTrustsCertificate ▶️ View Recording
CertificatesTrust_WithUntrustedCert_TrustsCertificate ▶️ View Recording
ConfigSetGet_CreatesNestedJsonFormat ▶️ View Recording
CreateAndRunAspireStarterProject ▶️ View Recording
CreateAndRunAspireStarterProjectWithBundle ▶️ View Recording
CreateAndRunEmptyAppHostProject ▶️ View Recording
CreateAndRunJsReactProject ▶️ View Recording
CreateAndRunPythonReactProject ▶️ View Recording
CreateAndRunTypeScriptEmptyAppHostProject ▶️ View Recording
CreateAndRunTypeScriptStarterProject ▶️ View Recording
CreateStartAndStopAspireProject ▶️ 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
GlobalMigration_HandlesCommentsAndTrailingCommas ▶️ View Recording
GlobalMigration_HandlesMalformedLegacyJson ▶️ View Recording
GlobalMigration_PreservesAllValueTypes ▶️ View Recording
GlobalMigration_SkipsWhenNewConfigExists ▶️ View Recording
GlobalSettings_MigratedFromLegacyFormat ▶️ View Recording
InvalidAppHostPathWithComments_IsHealedOnRun ▶️ View Recording
LegacySettingsMigration_AdjustsRelativeAppHostPath ▶️ View Recording
LogsCommandShowsResourceLogs ▶️ View Recording
PsCommandListsRunningAppHost ▶️ View Recording
PsFormatJsonOutputsOnlyJsonToStdout ▶️ View Recording
PublishWithDockerComposeServiceCallbackSucceeds ▶️ View Recording
RestoreGeneratesSdkFiles ▶️ View Recording
RunFromParentDirectory_UsesExistingConfigNearAppHost ▶️ View Recording
RunWithMissingAwaitShowsHelpfulError ▶️ 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 #23521402749

<TargetFramework>$(DefaultTargetFramework)</TargetFramework>
<IsPackable>true</IsPackable>
<SuppressFinalPackageVersion>true</SuppressFinalPackageVersion>
<DisablePackageBaselineValidation>true</DisablePackageBaselineValidation>
Copy link
Member

Choose a reason for hiding this comment

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

We should remember to remove this line once this is in main and update the package baseline to 13.2.0

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.