Merge v13.3.4 to main (replaces #17139)#17326
Conversation
…6566) * [release/13.3] Stabilizing builds in preparation for 13.3 release - Flip StabilizePackageVersion default to true in eng/Versions.props - Drop the compute_version_suffix step from ci.yml so PR builds use the stabilized version - Pin Aspire.AppHost.Sdk import to 13.3.0 in RepoTesting.targets - Pin all stabilizable Aspire packages to 13.3.0 in Directory.Packages.Helix.props (packages whose csproj sets SuppressFinalPackageVersion=true keep $(PackageVersion)) - Skip preview-only AppHosts (Kusto, Foundry, Keycloak, Kubernetes, Maui) in the TypeScript polyglot validation script (see #15335) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * [release/13.3] Skip tests blocked by suppressed-package stabilization gap Two test buckets cannot run on a stabilized branch because they exercise NuGet restore against Aspire.Hosting.* packages that have SuppressFinalPackageVersion=true and therefore only ship as prerelease (e.g. 13.3.0-dev.<sha>) — but the stabilized build asks for >= 13.3.0 stable. Polyglot SDK Validation: - Add 'Aspire.Hosting' to the skip list in test-typescript-playground.sh (it transitively depends on Aspire.Hosting.Azure.Kubernetes via aspire.config.json). - Apply the same skip block to test-python-playground.sh and test-java-playground.sh (the 13.2 PR only updated the TypeScript script). Cli.EndToEnd-KubernetesDeploy* (11 files): - Mark each [Fact] with [ActiveIssue(#15335)]. The proper fix is the dynamic version computation tracked by #15335 (PR #15681). When that lands the ActiveIssue tags can be removed. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…e strings (#16584) Replace HTML-embedded resource strings with plain label strings and move the <strong> formatting into Razor markup directly. This eliminates the need for MarkupString casts and string.Format for these toolbar items.
#16583) * Ensure compute environment prepare waits for validation When Foundry is used with another compute environment, the compute environments get confused about who takes ownership of which compute. Make all compute-environment prepare pipeline steps depend on the shared validate-compute-environments step so before-start cannot race environment validation. Add diagnostics coverage for a mixed Foundry hosted-agent and Azure Container Apps app. Cover deployment target lookup returning null for a different compute environment. * Fix tests --------- Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
…ifiers (#16564) * Initial plan * Normalize app service app insights bicep identifiers Agent-Logs-Url: https://github.com/microsoft/aspire/sessions/e848458a-5173-4241-b442-80d01de3d5c2 Co-authored-by: eerhardt <8291187+eerhardt@users.noreply.github.com> * Preserve app insights bicep suffix separators Agent-Logs-Url: https://github.com/microsoft/aspire/sessions/e848458a-5173-4241-b442-80d01de3d5c2 Co-authored-by: eerhardt <8291187+eerhardt@users.noreply.github.com> * Address PR feedback --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: eerhardt <8291187+eerhardt@users.noreply.github.com> Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
* Fix TypeScript package manager detection Treat package-lock.json as an npm marker and limit parent directory package manager probing to the AppHost directory's direct parent. Log the marker used to select the TypeScript AppHost package manager. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix TypeScript AppHost path comparisons Use OS-appropriate path comparison when deciding whether to skip root and home parent directories for package manager detection. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Preserve same-directory yarn marker precedence Keep yarn markers ahead of package-lock.json within the same candidate directory while still allowing a local npm lockfile to beat parent-directory yarn markers. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Remove yarn directory package manager hint Only use file-based yarn markers for TypeScript AppHost package manager detection and update the resolver test accordingly. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address TypeScript toolchain review feedback Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Sebastien Ros <sebastienros@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix Windows detached AppHost launcher Use the Windows DETACHED_PROCESS creation flag when launching the detached child CLI process so aspire start is not tied to the launching console lifetime. Keep the existing new process group and restricted handle inheritance behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Clarify Windows detach launcher comment Document that the detached Windows flag combination follows established daemonization patterns used by libuv/Node.js and GitHub CLI, without over-claiming Docker parity. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Remove Windows detach unit test Remove the unit test coverage for the Windows detached process creation flags while keeping the implementation change and manual repro validation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: David Fowler <davidfowl@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ne (#16582) * Validate build-only container references in the pipeline Add the publish/deploy validation step and implement the opt-out by clearing its RequiredBySteps during pipeline configuration. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix tests * PR feedback Move DisableBuildOnlyContainerValidation to the Pipeline. * PR feedback * Fix tests * Address build-only container validation feedback Ensure manifest publishing runs the build-only container validation step and strengthen tests to cover mixed consumed and unconsumed build-only containers. * Revert publish-manifest changes. * Apply suggestion from @eerhardt --------- Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Normalize CLI yes/no prompts Use single-key confirmation prompts for CLI yes/no choices so y/n answers are accepted without arrow-key selections while preserving [Y/n] and [y/N] defaults. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Prefer local hive versions in aspire add Treat the configured local hive as a local build channel so aspire add keeps generated AppHosts on the same CLI/SDK version and writes the local NuGet source when needed. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Revert "Prefer local hive versions in aspire add" This reverts commit 6821787. --------- Co-authored-by: Sebastien Ros <sebastienros@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(publishing): stage native CLI tool packages Download RID-specific Aspire.Cli tool packages from native build artifacts and stage them in the shipping packages directory so publishing can include them. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(publishing): validate CLI package RIDs Compare discovered CLI archives and RID-specific tool packages against the expected clipack RIDs, require exactly one pointer package, and summarize publish output without listing every NuGet package. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Ankit Jain <radical@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… avoid CLI log overlap (#16596) * Rename pipeline --log-level to --pipeline-log-level to avoid CLI log overlap The pipeline commands (do, publish, deploy, destroy) had a --log-level option that collided with the global CLI --log-level/-l option. When a user passed --log-level Debug to control pipeline verbosity, Program.ParseLoggingOptions() also picked it up and cranked CLI internal logging to Debug, flooding output with mixed noise. Rename the pipeline-specific option to --pipeline-log-level so the two concerns are cleanly separated: - --log-level / -l (global, recursive) controls CLI internal logging - --pipeline-log-level (pipeline commands only) controls pipeline step output The value is still forwarded as --log-level to the AppHost process, which is correct since the AppHost has its own --log-level parameter. Also adds tests verifying the separation and argument forwarding. * Rename s_logLevelOption to s_pipelineLogLevelOption
… symlinks fails (#16618) * Fallback to junctions if either creating OR evaluating symlinks fails * Update src/Aspire.Cli/Utils/ReparsePoint.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update outdated test verified results * Regenerate the verified file --------- Co-authored-by: David Negstad <David.Negstad@microsoft.com> Co-authored-by: David Negstad <50252651+danegsta@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Fix TypeScript AppHost generated port ranges Use a shared AppHost profile port generator for CLI templates, init, and TypeScript AppHost scaffolding so generated dashboard and service profile ports avoid the Windows ephemeral range. Add regression coverage for the generated TypeScript apphost.run.json ports. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * PR feedback --------- Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…#16590) * Fix unbounded collection growth in TelemetryRepository and related types - Add MaxResourceCount option to TelemetryLimitOptions (default 10,000) to cap _resources growth. Throws on limit exceeded. - Clear _logScopes, _logPropertyKeys on ClearStructuredLogs (full clear) and remove per-resource property keys on per-resource clear. - Clear _traceScopes, _tracePropertyKeys, _spanLinks on ClearTraces (full clear) and clean up span links and property keys per-resource. - Clear _meters alongside _instruments in OtlpResource.ClearMetrics. - Add internal const limits on TelemetryRepository for resource views (10,000), instruments (10,000), dimensions (10,000), known attribute value keys (10,000), and values per key (10,000). - Enforce instrument limit in OtlpResource.AddMetrics. - Enforce resource view limit in OtlpResource.GetView. - Enforce dimension limit in OtlpInstrument.FindScope. - Cap KnownAttributeValues keys and per-key value lists in OtlpInstrument.CreateDimensionScope. - Add clarifying comments to fields describing their bounds. * Add limit enforcement tests and fix uncaught exceptions from resource limit - Add TelemetryLimitTests with 5 tests for resource and instrument limits - Add maxResourceCount parameter to CreateRepository test helper - Wrap GetOrAddResource calls in GetPeerResource (return null), CalculateTraceUninstrumentedPeers, and OnPeerChanged with try/catch - Fix _meters comment to not claim an unenforced bound - Document TOCTOU soft-cap behavior on resource limit check * Reset HasTraces/HasLogs and clear unviewed error logs on full clear - ClearTraces full-clear now resets HasTraces on all resources - ClearStructuredLogs full-clear now resets HasLogs on all resources and clears _resourceUnviewedErrorLogs * Remove redundant per-telemetry-type resource limit tests * Add scope and instrument limits with TryGetValue pattern - Add MaxScopeCount limit to TryGetOrAddScope, using TryGetValue instead of GetValueRefOrAddDefault to avoid add-then-remove on overflow - Refactor instrument add in OtlpResource to use TryGetValue + count check before inserting, removing the add-then-remove pattern - Fix AddLogs failure count: count log records, not scopes - Fix AddMetrics failure count: count data points, not metrics - Add tests for resource limit, scope limit, and correct failure counting
#16633) KubernetesGatewayExtensions and KubernetesIngressExtensions were in the Aspire.Hosting.Kubernetes namespace, requiring users to add an explicit using directive. Move them to Aspire.Hosting to match the convention used by other extension methods like KubernetesEnvironmentExtensions and KubernetesServiceExtensions. Co-authored-by: Mitch Denny <mitch@mitchdenny.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Remove obsolete internal compatibility shims from the ATS export surface so generated polyglot SDKs only expose the unified methods. Co-authored-by: Sebastien Ros <sebastienros@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add BrowserLogs CDP transport seam Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Use CDP pipe for BrowserLogs owned browsers Switch owned tracked-browser launches to a private CDP pipe, keep WebSocket adoption as an opt-in seam, and add session/persistent process lifetime configuration. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Remove BrowserLogs persistent lifetime BrowserLogs pipe-launched browsers are always session scoped because Chromium exits when the CDP pipe closes. Remove the public lifetime option and mark public BrowserLogs types experimental. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Split BrowserLogs pipe launcher partials Move platform-specific native launch logic into Windows and Unix partial classes while keeping the shared launcher entry points in the common file. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Use posix_spawn for BrowserLogs Unix pipe launches Replace the managed fork/exec launcher with posix_spawn file actions so Chromium still receives CDP pipe fds 3 and 4 without running managed code in a forked child. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Move BrowserLogs to Aspire.Hosting.Browsers Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Move BrowserLogs tests to Browsers assembly Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Update CI snapshots after BrowserLogs move Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Update TypeScript capabilities snapshot Remove the BrowserLogs capability from the Hosting assembly scanner snapshot now that BrowserLogs lives in Aspire.Hosting.Browsers. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Remove BrowserLogs friend assembly access Stop relying on InternalsVisibleTo for the Browsers package and its tests by source-sharing the BrowserLogs implementation into the test assembly and replacing Hosting-internal runtime dependencies with public-compatible behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Restore BrowserLogs health report publishing Add a public CustomResourceSnapshot helper for publishing health reports without InternalsVisibleTo and use it to restore BrowserLogs session and last-error health report rows. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address BrowserLogs localization feedback Add translator comments for BrowserLogs resource strings with format placeholders and regenerate XLF files. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix review findings in BrowserLogs - Fix null-forgiveness on screenshot Data property to throw InvalidOperationException instead of ArgumentNullException - Guard _stopCts.Cancel() against ObjectDisposedException when MonitorAsync cleanup races with StopAsync - Block '..' path traversal in SanitizePathSegment Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: David Fowler <davidfowl@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Mitch Denny <mitch@mitchdenny.com>
…Host endpoint fix (#16585) * Support Gateway TLS without pre-known hostname (FQDN discovery) When WithTls() is called without WithHostname(), the Gateway now: 1. Generates an HTTPS listener without a hostname restriction 2. After Helm deploy, polls Gateway status for the assigned address 3. Patches the HTTPS listener to add the discovered hostname 4. Creates a bootstrap self-signed TLS secret with the discovered FQDN 5. cert-manager then detects the hostname and issues a real certificate This enables a single-deploy TLS workflow for controllers like AGC that assign FQDNs automatically (e.g., *.alb.azure.com), without requiring users to deploy once to discover the FQDN and then redeploy with it. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Use helm field-manager for Gateway hostname patch to avoid conflicts After patching the Gateway hostname via JSON patch, re-apply the full Gateway YAML with --server-side --field-manager=helm --force-conflicts to transfer field ownership back to Helm. This prevents SSA conflicts when the user later redeploys with an explicit hostname via WithHostname(). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix endpoint resource lookup for TS AppHost RPC bridge Use ResourceNameComparer on the deploymentTargets dictionary so that endpoint references created through the TypeScript AppHost RPC bridge (which may use a different resource instance) resolve correctly by resource name. This matches the pattern already used in KubernetesEnvironmentContext._kubernetesComponents. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix test assertion for YAML quoted protocol values The YAML serializer quotes string values like protocol: "HTTPS" on CI. Use a more flexible assertion that matches both quoted and unquoted forms. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address all automated review feedback 1. Address type validation: Parse full Gateway JSON status, prefer Hostname-type addresses, fall back to DNS-like values, skip IPs. 2. Use -o json instead of jsonpath: Parse full Gateway JSON for both address discovery and listener index detection. More reliable. 3. Use JsonSerializer + --patch-file: Build JSON patch operations with proper serialization, write to temp file to avoid shell escaping. 4. Minimal manifest for field ownership: Read current Gateway JSON, strip server fields (status, resourceVersion, managedFields), keep only apiVersion/kind/metadata(name,namespace)/spec for SSA apply. 5. Temp file pattern: Use CreateTempSubdirectory consistently. 6. Add SAN to bootstrap certs: Add SubjectAlternativeNameBuilder with DNS name in both DiscoverFqdnAndBootstrapTlsAsync and the existing BootstrapTlsSecretsAsync. Modern TLS clients require SAN. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Preserve annotations and labels in Gateway ownership transfer The minimal manifest used for server-side apply field ownership transfer was missing annotations and labels, causing AGC annotations like alb.networking.azure.io/alb-name to be stripped. Now copies annotations and labels from the current Gateway metadata. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add E2E test for K8S Gateway TLS deployment with HTTP-01 Tests the full flow: provision AKS with ALB controller, install cert-manager with gatewayHTTPRoute HTTP-01 solver, create a project with AddKubernetesEnvironment + AddGateway + WithTls (no hostname), deploy with aspire deploy, and verify FQDN discovery, certificate issuance, and HTTPS access. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Use --enable-alb in az aks create and AMD VM SKU Consolidate ALB enablement into the az aks create command instead of a separate az aks update step. Use Standard_D2as_v5 (AMD) for quota compatibility with E2E test subscription. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix E2E test: use --enable-gateway-api --enable-application-load-balancer Per the official AGC quickstart docs, use the correct flags: - --enable-gateway-api: enables Gateway API CRDs - --enable-application-load-balancer: enables ALB controller addon - --network-plugin azure: required Azure CNI - Standard_D2as_v5: AMD VM SKU for quota compatibility - Use the add-on's auto-created aks-appgateway subnet instead of creating one manually Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Wait for ALB controller pods to be Running before checking GatewayClass The ALB controller pods need time to initialize after cluster creation. Poll until pods are Running and GatewayClass azure-alb-external exists, with up to 10 minutes timeout. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix ClusterIssuer: parentRefs requires name and namespace cert-manager requires parentRefs to include a name. Use 'ingress' to match the Gateway name from AddGateway('ingress'), and include the namespace to match the Helm deploy namespace. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix E2E test AppHost: add using directive and pragma suppressions The injected AppHost code needs: - using Aspire.Hosting.Kubernetes for AddGateway extension methods - #pragma warning disable ASPIRECOMPUTE003 for AddContainerRegistry Both prepended to the top of the file alongside ASPIREPIPELINES001. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix E2E test: capture webfrontend variable from starter template The starter template generates builder.AddProject('webfrontend') without assigning to a variable. The Gateway route needs a reference to it, so inject 'var webfrontend =' before the AddProject call. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Refactor FQDN discovery polling to use Polly retry pipeline Replace the manual for-loop retry with a Polly ResiliencePipeline using constant 5s backoff, 60 max attempts, and result-based retry (retries when result is null). Polly.Core is already a transitive dependency via Aspire.Hosting. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Mitch Denny <mitch@mitchdenny.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix Python starter health check template Update the Python starter TypeScript AppHost to use the supported withHttpHealthCheck options object and align its root build script with AppHost-only type checking. Add E2E coverage that verifies the generated starter builds successfully. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Use fail-fast helper for Python starter build test Update the Python React template E2E build verification to use the existing fail-fast command helper so npm build failures are surfaced immediately. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Verify TypeScript templates build Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add build script aliases to TypeScript AppHost scaffold Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Use AppHost tsconfig for TypeScript AppHost lint Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Use AppHost tsconfig name for Python starter Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Sebastien Ros <sebastienros@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The 'Finding apphosts' message was displayed via DisplayMessage, which the extension renders as a sticky vscode.window.showInformationMessage toast that has no programmatic dismissal. Fold it into the surrounding ShowStatusAsync status text so it rides on the existing progress notification (auto-dismissed via the finally block) instead. Co-authored-by: Adam Ratzman <adam@adamratzman.com>
* API Review Feedback Addressing feedback from #16602 Rename JS experimental ID, refactor AKS/EF resource APIs Renames ASPIREEXTENSION001 to ASPIREJAVASCRIPT001 for JavaScript APIs, resources, and tests. Refactors AKS-related code to Aspire.Hosting.Azure.Kubernetes, makes AksSkuTier internal, and defaults AKS SKU tier to Free. Renames EFMigrationResource.ContextTypeName to DbContextTypeName throughout. Adds missing using directives, Experimental attributes, and AspireValue metadata. Updates tests and samples for new names and diagnostics. * Remove unused enum * Change more dbContextTypeName instances. * Update CodeGeneration snapshots for new WellKnownPipelineSteps entries Adding [AspireValue("WellKnownPipelineSteps")] to BeforeStart and CheckContainerRuntime causes the language code generators to emit them in the WellKnownPipelineSteps exported value catalog. Update the TwoPassScanningGeneratedAspire snapshots for Go, Java, Python, Rust, and TypeScript to include the two new entries. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com> Co-authored-by: Jose Perez Rodriguez <joperezr@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…CLI HTTP requests (#16708) * Normalize *.localhost dashboard URLs to localhost for HTTP requests DNS resolvers typically don't implement RFC 6761 for localhost subdomains, so hosts like 'myapp.dev.localhost' fail to resolve. This adds NormalizeDashboardUrl to McpToolHelpers which rewrites *.localhost API base URLs to localhost before making HTTP requests, while preserving the original hostname in dashboard display URLs (used in JSON output hyperlinks). - Add NormalizeDashboardUrl and IsLocalhostTld to McpToolHelpers - Normalize API base URL in TelemetryCommandHelpers and McpToolHelpers - Preserve original *.dev.localhost hostname in dashboard display URLs - Add unit tests for logs/traces with dev.localhost backchannel URLs - Add E2E test variant using dev.localhost dashboard URL * Refactor E2E test to use aspire ps --format json for dashboard URL * Fix E2E test: use --frontend-url and extract dashboard URL from logs - Use --frontend-url instead of invalid --dashboard-url for aspire dashboard run - Extract dashboard login URL from log output instead of aspire ps (which cannot discover standalone dashboards) - Pass login?t=xxx URL to aspire otel traces for proper token exchange - dev.localhost variant passes *.localhost to --frontend-url to exercise NormalizeDashboardUrl end-to-end * Fix E2E test: extract URL from dashboard run output, use --allow-anonymous - Add --allow-anonymous to avoid token exchange issues in standalone mode - Extract dashboard URL from 'Now listening on:' in aspire dashboard run output - Avoids needing login token exchange which fails in container E2E tests * Fix E2E test: use auth with login token from dashboard run output - Remove --allow-anonymous to verify authentication works end-to-end - Extract login URL (with ?t=xxx token) from aspire dashboard run output - CLI exchanges login token for API key via validateToken endpoint * Add echo of OTEL_DASHBOARD_URL for debugging visibility * Add AppHost otel traces tests with dev.localhost variant - Add AppHostOtelTracesReturnsTraces and _DevLocalhost variants - New tests create Starter project, start AppHost, generate traces, verify otel traces output - DevLocalhost variant uses useDevLocalhost flag in AspireNewAsync to test URL normalization - Add useDevLocalhost parameter to AspireNewAsync helper * Fix standalone dashboard tests and add dev.localhost otel logs test - Fix grep regex to use [a-f0-9]+ for token to avoid Spectre Console link duplication - Remove AppHost otel traces tests (covered by OtelLogs tests) - Add OtelLogsReturnsStructuredLogsFromStarterApp_DevLocalhost test * Use DASHBOARD__FRONTEND__BROWSERTOKEN instead of parsing URL from logs Spectre Console OSC 8 escape sequences in redirected output cause grep to capture a doubled URL. Instead, set a known browser token via env var and construct the dashboard URL directly. * Fix AspireStartAsync sed pattern to match *.localhost dashboard URLs The sed pattern for extracting dashboardUrl from JSON only matched 'localhost' literally. With dev.localhost subdomains (e.g. dashboard.dev.localhost:18888), the pattern failed to match, causing 'aspire start did not return a dashboard URL'. Broadened to [a-z.]*localhost. * Preserve original *.localhost hostname in display URLs for --dashboard-url path The --dashboard-url code path was normalizing the URL and using it for both HTTP requests and JSON output hyperlinks. Now it preserves the original hostname (e.g. dashboard.dev.localhost) for display URLs while still normalizing to localhost for HTTP requests, matching the backchannel path behavior. Also adds remarks to NormalizeDashboardUrl explaining the RFC 6761 DNS resolution motivation, and tests for the --dashboard-url display URL preservation. * Address review comments: normalize URL in StaticDashboardInfoProvider, fix error messages, fix E2E test - Normalize apiBaseUrl in StaticDashboardInfoProvider so aspire agent mcp --dashboard-url with *.dev.localhost URLs works correctly - Use displayDashboardUrl in error messages so users see the URL they typed - Fix E2E test to pass frontendUrl to aspire otel traces, actually exercising the NormalizeDashboardUrl code path end-to-end * Add test asserting error messages show original *.dev.localhost URL * Add E2E tests for aspire agent mcp list_structured_logs * Rename DashboardOtelTracesTests to DashboardRunTests and add agent mcp tests - Rename class and file to DashboardRunTests - Add E2E tests for aspire agent mcp --dashboard-url against standalone dashboard - Extract CallAgentMcpToolAsync helper to CliE2EAutomatorHelpers - Use shared helper in AgentMcpLogsTests
…ilds (#16654) (#16672) * [release/13.3] Fix aspire init template install for non-stable CLI builds (#16654) �spire init ran `dotnet new install Aspire.ProjectTemplates@<cliVersion+sha>` with `nugetConfigFile: null` and `nugetSource: null`, bypassing the channel feed wiring used by `aspire new`. For non-stable CLI builds (staging/daily/PR), `Aspire.ProjectTemplates@<cliVersion+sha>` is only available on a per-commit darc feed (e.g. `darc-pub-microsoft-aspire-<sha8>`), so install failed with exit code 103 in any C# repo containing a `.sln`. Extract the channel-aware template package resolution and install logic out of `DotNetTemplateFactory.ApplyTemplateAsync` and into `TemplateNuGetConfigService` as `ResolveTemplatePackageAsync` and `InstallTemplatePackageAsync`. Both `DotNetTemplateFactory` and `InitCommand` now consume the helper. The existing `aspire new` install path is preserved bit-for-bit (extraction is mechanical; `IncludePrHives: true` keeps PR-hive widening behavior). For `aspire init` this means: - The version sent to `dotnet new install` is now the channel-resolved one (e.g. `13.3.0`), not the raw `+sha` build metadata. - Init now honors the global `channel` configuration, matching `aspire new`. - On install failure, captured stdout/stderr is displayed before the error. - `ChannelNotFoundException` and `EmptyChoicesException` produce friendly errors instead of bubbling to the top-level "unexpected error" handler. - PR hives are intentionally NOT included in init's channel discovery so a developer with stale `~/.aspire/hives/*` doesn't get a different template than they'd get on a clean machine. Notes: - `TemplateNuGetConfigService` is a singleton; `IDotNetCliRunner` is transient and is therefore passed as a method parameter to `InstallTemplatePackageAsync` instead of being injected. - New regression tests cover: explicit channel passes the temp NuGet config, implicit channel leaves it null, PR hives don't widen init, and channel resolution failures produce friendly errors. Fixes #16654 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address PR review feedback (#16672) Multi-model code review caught the following issues: 1. Restore original order of operations in DotNetTemplateFactory.ApplyTemplateAsync. The first refactor moved extraArgsCallback ahead of template package resolution, which changed prompt/error precedence for `aspire new` (extra-args prompts like Redis-cache, test-framework, xUnit-version would now run before channel lookup, and answers would be discarded if resolution failed afterward). Restored the BEFORE order from release/13.3: ResolveTemplatePackageAsync first, then extraArgsCallback, then InstallTemplatePackageAsync. Updated the in-source comment to be accurate. 2. Catch NuGetPackageCacheException in InitCommand.DropCSharpProjectSkeletonAsync. The pre-extraction init code went straight to `dotnet new install` and never invoked a NuGet search, so feed search failures (offline, inaccessible feed, etc.) couldn't bubble up. After the extraction init now performs the search and was missing the catch, surfacing the failure as an unhandled "unexpected error". Added the catch with the same friendly-error treatment as ChannelNotFoundException / EmptyChoicesException. 3. Use TemplatingStrings.TemplateInstallationFailed in InitCommand for parity with `aspire new`. The previous ad-hoc string omitted the log file path, making post-mortem diagnosis harder. 4. Added a comment in InstallTemplatePackageAsync clarifying that the temporary NuGet config is intentionally disposed at the end of the install (only `dotnet new install` consumes it; the subsequent `dotnet new <template>` call uses the already-installed template hive and ambient NuGet config). 5. Added regression test InitCommand_WhenChannelTemplateSearchFails_DisplaysFriendlyError covering the new NuGetPackageCacheException catch. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move the JSON code writer out of Aspire.TypeSystem so it is not exposed as public API. Link the shared internal helper into each CLI and code generation project that uses it. Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Validate TypeScript AppHost before start Add a pre-execute runtime hook and use it to run TypeScript type validation before starting or publishing TypeScript AppHosts. Watch mode validates on every restart so startup is not blocked by existing errors while editing. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address TypeScript AppHost review feedback Clarify the PreExecute contract and make Bun typecheck/watch commands use project-local binaries via bun run instead of bun x. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix TypeScript AppHost E2E type checks Use Yarn run for project-local TypeScript tools so arguments are forwarded correctly, and update the TypeScript publish E2E fixture to use the typed dashboard options shape. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix Kubernetes TypeScript E2E type check Update the Kubernetes TypeScript deploy E2E fixture to use the generated withHelm options shape so it passes runtime type validation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Use project-local Bun nodemon in watch Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Sebastien Ros <sebastienros@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…4 On relative base path root Microsoft.DeveloperControlPlane.darwin-amd64 , Microsoft.DeveloperControlPlane.darwin-arm64 , Microsoft.DeveloperControlPlane.linux-amd64 , Microsoft.DeveloperControlPlane.linux-arm64 , Microsoft.DeveloperControlPlane.linux-musl-amd64 , Microsoft.DeveloperControlPlane.windows-amd64 , Microsoft.DeveloperControlPlane.windows-arm64 From Version 0.23.3 -> To Version 0.23.4 (#16757) Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
* Fix HostUrl with container tunnel Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Scope HostUrl matching to host endpoints Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: David Negstad <David.Negstad@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
) * Avoid AppHost discovery when config path is valid Validate configured AppHost paths before using them and skip recursive discovery for normal CLI resolution when the configured path is already a valid AppHost. Preserve candidate listing behavior so extension commands can still enumerate all AppHost candidates. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Restore silent: true for fast-path settings lookup Reverts an unintended verbosity change so users with a stale legacy .aspire/settings.json don't see a 'AppHost was specified but doesn't exist' warning on every aspire run when the CLI is going to fall back to discovery anyway. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add ProjectLocator tests for fast-path coverage requested in review - Add Throw-mode variant of UseOrFindAppHostProjectFileUsesValidSettingsWithoutScanning to prove recursive discovery is also skipped for non-interactive/JSON callers. - Add fast-path test with a configured guest AppHost (apphost.ts) and a throwing language discovery to cover the production guest-AppHost scenario from the issue. - Add a parameterized fallback test that verifies an existing-but-invalid configured AppHost (IsUnsupported / IsPossiblyUnbuildable) falls back to discovery. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: adamint <adamratzman1@gmail.com>
* Reject Yarn Classic for TypeScript AppHosts Yarn Classic is not supported for TypeScript AppHosts because its command behavior differs from supported package managers and can break Aspire argument forwarding. Detect Yarn Classic through packageManager declarations and Yarn v1 lockfiles, then fail early with guidance to use Yarn 4 or later, npm, pnpm, or Bun. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Update yarn tests to v4 * Update tes dockerfiles --------- Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Run dashboard in .NET 11 * Update * Update
* Fix Aspire new empty AppHost language picker Keep a single interactive Empty AppHost template entry while retaining direct language-specific subcommands for non-interactive creation. Filter the language picker by enabled AppHost languages and add missing Python/Rust shortcut template IDs. Update NewCommand tests and E2E helper selection for the new flow. * Address empty AppHost prompt review feedback * Include hidden templates in non-interactive suggestions * Stop persisting new command language selection * Allow language option on new subcommands --------- (cherry picked from commit 8bd4b60) Co-authored-by: Maddy Montaquila (Leger) <maddyleger1@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: joperezr <13854455+joperezr@users.noreply.github.com>
#17070) On relative base path root Microsoft.DeveloperControlPlane.darwin-amd64 , Microsoft.DeveloperControlPlane.darwin-arm64 , Microsoft.DeveloperControlPlane.linux-amd64 , Microsoft.DeveloperControlPlane.linux-arm64 , Microsoft.DeveloperControlPlane.linux-musl-amd64 , Microsoft.DeveloperControlPlane.windows-amd64 , Microsoft.DeveloperControlPlane.windows-arm64 From Version 0.24.1 -> To Version 0.23.6 (cherry picked from commit 3f7c8ab) Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Backport the Aspire skill metadata length fix and regression coverage for agent host description limits. Backport of #17183 to release/13.3 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: joperezr <13854455+joperezr@users.noreply.github.com>
Brings forward changes from v13.3.4 that originated on the release/13.3 branch. Conflict resolution policy applied: - eng/Versions.props, eng/Version.Details.xml, polyglot/Helix/CI infra: keep main (do not stabilize main; keep 13.4.0 unstable build). - src/*/api/*.cs and src/*/api/*.txt: take v13.3.4 regenerated API baselines so main reflects shipped 13.3 APIs. - All other conflicts: take main; forward-bound release-only PRs that need genuine application will be added as follow-up commits. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The merge commit took main's version of DashboardCommandExecutor.cs and NotificationEntryComponent.razor.cs, but INotificationService.cs was only modified on release (changing OnClick to Func<IServiceProvider, Task>). Without this commit, the merge breaks the build because the call sites do not pass IServiceProvider. Reconcile by applying #16763's call-site changes on top of main: - DashboardCommandExecutor.cs: thread IStringLocalizer through CreateViewResponseNotificationAction so the lambda no longer closes over scoped services; resolve DashboardDialogService from the IServiceProvider passed to OnClick. - NotificationEntryComponent.razor.cs: inject IServiceProvider and pass it to primaryAction.OnClick while preserving main's Dialog.Hide/Dialog.Show wrapping. - Keep main's FluentMessageIntent enum naming (the rename was forward work on main and is unrelated to the closure fix). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Two release-only PRs renamed identifiers that already had call sites on main, and the merge needs follow-up edits to keep main building: - PR #16596 (release-only): renamed pipeline option from s_logLevelOption to s_pipelineLogLevelOption and switch --log-level to --pipeline-log-level. PipelineCommandBase.cs picked up the rename via the merge (file only changed on release). DestroyCommand.cs was conflicted (main also added the --yes / --non-interactive validation) and resolved as 'take main', which still referenced the old name. Update the single call site here to s_pipelineLogLevelOption to match the base class. - ExitCodeConstants was renamed to CliExitCodes on main while the TelemetryTracesCommandTests.cs file (added by release-only telemetry work) still referenced the old name. Rename to CliExitCodes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 17326Or
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 17326" |
There was a problem hiding this comment.
Pull request overview
Back-merges the v13.3.4 release tag into main to align main with shipped 13.3 API baselines while preserving main’s 13.4.0 unstable versioning, and reconciles a small set of post-merge conflicts (notably dashboard notification actions and CLI pipeline log-level option behavior).
Changes:
- Updates shipped public API baselines (
src/*/api/*.cs) and related hosting Azure API surface adjustments. - Reconciles dashboard changes (notification action service-scope fix, OTLP telemetry bounding, UI resource-string markup removal, framework JS selection).
- Updates CLI pipeline log-level forwarding + adds/adjusts CLI E2E and unit tests (including dev.localhost/MCP scenarios).
Show a summary per file
| File | Description |
|---|---|
| tests/Shared/Telemetry/TelemetryTestHelpers.cs | Adds ability to configure MaxResourceCount in telemetry repository tests. |
| tests/Shared/Hex1bAutomatorTestHelpers.cs | Adds automation support for answering the “Use *.dev.localhost URLs” prompt. |
| tests/Aspire.Cli.Tests/Utils/CliTestHelper.cs | Updates CLI test DI setup (includes a new service registration). |
| tests/Aspire.Cli.Tests/Commands/DoCommandTests.cs | Adds unit tests for pipeline log-level forwarding behavior. |
| tests/Aspire.Cli.EndToEnd.Tests/TypeScriptStarterTemplateTests.cs | Adds E2E coverage for TypeScript Express/React starter creation + run/build. |
| tests/Aspire.Cli.EndToEnd.Tests/Helpers/CliE2EAutomatorHelpers.cs | Updates dashboardUrl extraction (dev.localhost) and adds MCP tool-call helper. |
| tests/Aspire.Cli.EndToEnd.Tests/DashboardOtelTracesTests.cs | Removes an older E2E test class (replaced by other coverage). |
| tests/Aspire.Cli.EndToEnd.Tests/AgentMcpLogsTests.cs | Adds E2E coverage for aspire agent mcp structured logs (incl. isolated + dev.localhost). |
| src/Aspire.Hosting.Valkey/api/Aspire.Hosting.Valkey.cs | API baseline updates for Valkey exports/interfaces. |
| src/Aspire.Hosting.Testing/api/Aspire.Hosting.Testing.cs | API baseline updates for exported endpoint accessor. |
| src/Aspire.Hosting.SqlServer/api/Aspire.Hosting.SqlServer.cs | API baseline updates for SQL Server hosting types/interfaces/exports. |
| src/Aspire.Hosting.Seq/api/Aspire.Hosting.Seq.cs | API baseline updates for Seq hosting exports/interfaces. |
| src/Aspire.Hosting.Redis/api/Aspire.Hosting.Redis.cs | API baseline updates for Redis hosting exports/interfaces. |
| src/Aspire.Hosting.RabbitMQ/api/Aspire.Hosting.RabbitMQ.cs | API baseline updates for RabbitMQ hosting exports/interfaces. |
| src/Aspire.Hosting.Qdrant/api/Aspire.Hosting.Qdrant.cs | API baseline updates for Qdrant hosting exports/interfaces. |
| src/Aspire.Hosting.Python/api/Aspire.Hosting.Python.cs | API baseline updates for Python hosting exports. |
| src/Aspire.Hosting.PostgreSQL/api/Aspire.Hosting.PostgreSQL.cs | API baseline updates for PostgreSQL hosting exports/interfaces. |
| src/Aspire.Hosting.Oracle/api/Aspire.Hosting.Oracle.cs | API baseline updates for Oracle hosting exports/interfaces. |
| src/Aspire.Hosting.OpenAI/api/Aspire.Hosting.OpenAI.cs | API baseline updates for OpenAI hosting exports/interfaces. |
| src/Aspire.Hosting.Nats/api/Aspire.Hosting.Nats.cs | API baseline updates for NATS hosting exports/interfaces. |
| src/Aspire.Hosting.MySql/api/Aspire.Hosting.MySql.cs | API baseline updates for MySQL hosting exports/interfaces. |
| src/Aspire.Hosting.MongoDB/api/Aspire.Hosting.MongoDB.cs | API baseline updates for MongoDB hosting exports/interfaces. |
| src/Aspire.Hosting.Milvus/api/Aspire.Hosting.Milvus.cs | API baseline updates for Milvus hosting exports/interfaces. |
| src/Aspire.Hosting.Maui/api/Aspire.Hosting.Maui.cs | API baseline updates for MAUI hosting exports. |
| src/Aspire.Hosting.Keycloak/api/Aspire.Hosting.Keycloak.cs | API baseline updates for Keycloak hosting exports. |
| src/Aspire.Hosting.Kafka/api/Aspire.Hosting.Kafka.cs | API baseline updates for Kafka hosting exports/interfaces. |
| src/Aspire.Hosting.GitHub.Models/api/Aspire.Hosting.GitHub.Models.cs | API baseline updates for GitHub Models hosting exports/interfaces. |
| src/Aspire.Hosting.Garnet/api/Aspire.Hosting.Garnet.cs | API baseline updates for Garnet hosting exports/interfaces. |
| src/Aspire.Hosting.EntityFrameworkCore/api/Aspire.Hosting.EntityFrameworkCore.cs | Adds/updates EF Core migration resource API baseline. |
| src/Aspire.Hosting.Docker/api/Aspire.Hosting.Docker.cs | Adds privileged support to Docker compose model API baseline. |
| src/Aspire.Hosting.DevTunnels/api/Aspire.Hosting.DevTunnels.cs | API baseline updates for dev tunnels exports. |
| src/Aspire.Hosting.Browsers/api/Aspire.Hosting.Browsers.cs | Adds/updates browser logs APIs (experimental) baseline. |
| src/Aspire.Hosting.Azure.WebPubSub/api/Aspire.Hosting.Azure.WebPubSub.cs | API baseline updates for WebPubSub (incl. private endpoint target signature). |
| src/Aspire.Hosting.Azure.Sql/api/Aspire.Hosting.Azure.Sql.cs | API baseline updates for Azure SQL (incl. private endpoint target signature). |
| src/Aspire.Hosting.Azure.SignalR/api/Aspire.Hosting.Azure.SignalR.cs | API baseline updates for Azure SignalR (private endpoint target signature). |
| src/Aspire.Hosting.Azure.Search/api/Aspire.Hosting.Azure.Search.cs | API baseline updates for Azure Search (private endpoint target signature). |
| src/Aspire.Hosting.Azure.Redis/api/Aspire.Hosting.Azure.Redis.cs | API baseline updates for Azure Redis (private endpoint target signature). |
| src/Aspire.Hosting.Azure.OperationalInsights/api/Aspire.Hosting.Azure.OperationalInsights.cs | API baseline updates for Log Analytics workspace resource surface. |
| src/Aspire.Hosting.Azure.Kusto/api/Aspire.Hosting.Azure.Kusto.cs | API baseline updates for Kusto (private endpoint target signature). |
| src/Aspire.Hosting.Azure.KeyVault/api/Aspire.Hosting.Azure.KeyVault.cs | API baseline updates for KeyVault (private endpoint target signature). |
| src/Aspire.Hosting.Azure.FrontDoor/api/Aspire.Hosting.Azure.FrontDoor.cs | Adds/updates Front Door resource API baseline. |
| src/Aspire.Hosting.Azure.ContainerRegistry/api/Aspire.Hosting.Azure.ContainerRegistry.cs | API baseline updates for ACR + private endpoint target surface. |
| src/Aspire.Hosting.Azure.CognitiveServices/api/Aspire.Hosting.Azure.CognitiveServices.cs | API baseline updates for Azure OpenAI resource surface. |
| src/Aspire.Hosting.Azure.AppService/api/Aspire.Hosting.Azure.AppService.cs | API baseline updates for App Service env + new HTTPS-upgrade export. |
| src/Aspire.Hosting.Azure.ApplicationInsights/api/Aspire.Hosting.Azure.ApplicationInsights.cs | API baseline updates for App Insights resource surface. |
| src/Aspire.Hosting.Azure.AppContainers/api/Aspire.Hosting.Azure.AppContainers.cs | API baseline updates for ACA env + domain config export annotation changes. |
| src/Aspire.Hosting.Azure.AppConfiguration/api/Aspire.Hosting.Azure.AppConfiguration.cs | API baseline updates for App Configuration (private endpoint target signature). |
| src/Aspire.Dashboard/Resources/xlf/ControlsStrings.zh-Hant.xlf | Localization updates for dashboard control strings (resource/timestamp/duration labels). |
| src/Aspire.Dashboard/Resources/xlf/ControlsStrings.zh-Hans.xlf | Localization updates for dashboard control strings. |
| src/Aspire.Dashboard/Resources/xlf/ControlsStrings.tr.xlf | Localization updates for dashboard control strings. |
| src/Aspire.Dashboard/Resources/xlf/ControlsStrings.ru.xlf | Localization updates for dashboard control strings. |
| src/Aspire.Dashboard/Resources/xlf/ControlsStrings.pt-BR.xlf | Localization updates for dashboard control strings. |
| src/Aspire.Dashboard/Resources/xlf/ControlsStrings.pl.xlf | Localization updates for dashboard control strings. |
| src/Aspire.Dashboard/Resources/xlf/ControlsStrings.ko.xlf | Localization updates for dashboard control strings. |
| src/Aspire.Dashboard/Resources/xlf/ControlsStrings.ja.xlf | Localization updates for dashboard control strings. |
| src/Aspire.Dashboard/Resources/xlf/ControlsStrings.it.xlf | Localization updates for dashboard control strings. |
| src/Aspire.Dashboard/Resources/xlf/ControlsStrings.fr.xlf | Localization updates for dashboard control strings. |
| src/Aspire.Dashboard/Resources/xlf/ControlsStrings.es.xlf | Localization updates for dashboard control strings. |
| src/Aspire.Dashboard/Resources/xlf/ControlsStrings.de.xlf | Localization updates for dashboard control strings. |
| src/Aspire.Dashboard/Resources/xlf/ControlsStrings.cs.xlf | Localization updates for dashboard control strings. |
| src/Aspire.Dashboard/Resources/ControlsStrings.resx | Replaces markup-containing strings with plain label strings. |
| src/Aspire.Dashboard/Resources/ControlsStrings.Designer.cs | Regenerates designer for renamed resource keys. |
| src/Aspire.Dashboard/Otlp/Model/OtlpResource.cs | Adds/adjusts telemetry bounding logic and metrics bookkeeping. |
| src/Aspire.Dashboard/Otlp/Model/OtlpInstrument.cs | Adds limits on dimensions/known attribute values to bound telemetry growth. |
| src/Aspire.Dashboard/Otlp/Model/OtlpHelpers.cs | Adds scope limit enforcement and updates scope-add logic. |
| src/Aspire.Dashboard/Model/INotificationService.cs | Changes notification action callback signature to take IServiceProvider. |
| src/Aspire.Dashboard/Model/DashboardCommandExecutor.cs | Updates notification action creation/invocation to avoid capturing scoped services. |
| src/Aspire.Dashboard/Configuration/DashboardOptions.cs | Adds a configurable MaxResourceCount telemetry limit. |
| src/Aspire.Dashboard/Components/Dialogs/NotificationEntryComponent.razor.cs | Injects IServiceProvider and passes it when invoking notification actions. |
| src/Aspire.Dashboard/Components/Controls/StructuredLogDetails.razor | Removes MarkupString usage; formats via localized labels + <strong>. |
| src/Aspire.Dashboard/Components/Controls/SpanDetails.razor | Removes MarkupString usage; formats via localized labels + <strong>. |
| src/Aspire.Dashboard/Components/App.razor | Adds version meta tags and selects Blazor JS based on runtime major version. |
| src/Aspire.Cli/Resources/xlf/DestroyCommandStrings.zh-Hant.xlf | Localization adds new destroy non-interactive validation string. |
| src/Aspire.Cli/Resources/xlf/DestroyCommandStrings.zh-Hans.xlf | Localization adds new destroy non-interactive validation string. |
| src/Aspire.Cli/Resources/xlf/DestroyCommandStrings.tr.xlf | Localization adds new destroy non-interactive validation string. |
| src/Aspire.Cli/Resources/xlf/DestroyCommandStrings.ru.xlf | Localization adds new destroy non-interactive validation string. |
| src/Aspire.Cli/Resources/xlf/DestroyCommandStrings.pt-BR.xlf | Localization adds new destroy non-interactive validation string. |
| src/Aspire.Cli/Resources/xlf/DestroyCommandStrings.pl.xlf | Localization adds new destroy non-interactive validation string. |
| src/Aspire.Cli/Resources/xlf/DestroyCommandStrings.ko.xlf | Localization adds new destroy non-interactive validation string. |
| src/Aspire.Cli/Resources/xlf/DestroyCommandStrings.ja.xlf | Localization adds new destroy non-interactive validation string. |
| src/Aspire.Cli/Resources/xlf/DestroyCommandStrings.it.xlf | Localization adds new destroy non-interactive validation string. |
| src/Aspire.Cli/Resources/xlf/DestroyCommandStrings.fr.xlf | Localization adds new destroy non-interactive validation string. |
| src/Aspire.Cli/Resources/xlf/DestroyCommandStrings.es.xlf | Localization adds new destroy non-interactive validation string. |
| src/Aspire.Cli/Resources/xlf/DestroyCommandStrings.de.xlf | Localization adds new destroy non-interactive validation string. |
| src/Aspire.Cli/Resources/xlf/DestroyCommandStrings.cs.xlf | Localization adds new destroy non-interactive validation string. |
| src/Aspire.Cli/Resources/xlf/ConsoleActivityLoggerStrings.zh-Hant.xlf | Localization updates pipeline failure hint to reference --pipeline-log-level. |
| src/Aspire.Cli/Resources/xlf/ConsoleActivityLoggerStrings.zh-Hans.xlf | Localization updates pipeline failure hint to reference --pipeline-log-level. |
| src/Aspire.Cli/Resources/xlf/ConsoleActivityLoggerStrings.tr.xlf | Localization updates pipeline failure hint to reference --pipeline-log-level. |
| src/Aspire.Cli/Resources/xlf/ConsoleActivityLoggerStrings.ru.xlf | Localization updates pipeline failure hint to reference --pipeline-log-level. |
| src/Aspire.Cli/Resources/xlf/ConsoleActivityLoggerStrings.pt-BR.xlf | Localization updates pipeline failure hint to reference --pipeline-log-level. |
| src/Aspire.Cli/Resources/xlf/ConsoleActivityLoggerStrings.pl.xlf | Localization updates pipeline failure hint to reference --pipeline-log-level. |
| src/Aspire.Cli/Resources/xlf/ConsoleActivityLoggerStrings.ko.xlf | Localization updates pipeline failure hint to reference --pipeline-log-level. |
| src/Aspire.Cli/Resources/xlf/ConsoleActivityLoggerStrings.ja.xlf | Localization updates pipeline failure hint to reference --pipeline-log-level. |
| src/Aspire.Cli/Resources/xlf/ConsoleActivityLoggerStrings.it.xlf | Localization updates pipeline failure hint to reference --pipeline-log-level. |
| src/Aspire.Cli/Resources/xlf/ConsoleActivityLoggerStrings.fr.xlf | Localization updates pipeline failure hint to reference --pipeline-log-level. |
| src/Aspire.Cli/Resources/xlf/ConsoleActivityLoggerStrings.es.xlf | Localization updates pipeline failure hint to reference --pipeline-log-level. |
| src/Aspire.Cli/Resources/xlf/ConsoleActivityLoggerStrings.de.xlf | Localization updates pipeline failure hint to reference --pipeline-log-level. |
| src/Aspire.Cli/Resources/xlf/ConsoleActivityLoggerStrings.cs.xlf | Localization updates pipeline failure hint to reference --pipeline-log-level. |
| src/Aspire.Cli/Resources/DestroyCommandStrings.resx | Adds new destroy non-interactive validation string. |
| src/Aspire.Cli/Resources/DestroyCommandStrings.Designer.cs | Regenerates designer for new destroy string. |
| src/Aspire.Cli/Resources/ConsoleActivityLoggerStrings.resx | Updates pipeline failure hint to reference --pipeline-log-level. |
| src/Aspire.Cli/Mcp/Tools/McpToolHelpers.cs | Normalizes *.localhost dashboard API base URLs for HTTP requests. |
| src/Aspire.Cli/Mcp/Tools/IDashboardInfoProvider.cs | Preserves display URL while normalizing API base URL. |
| src/Aspire.Cli/Commands/TelemetryCommandHelpers.cs | Normalizes dashboard URLs for API calls while preserving display URLs in errors/output. |
| src/Aspire.Cli/Commands/PublishCommand.cs | Uses pipeline-specific log-level option when forwarding to AppHost. |
| src/Aspire.Cli/Commands/PipelineCommandBase.cs | Renames pipeline option to --pipeline-log-level and updates parsing. |
| src/Aspire.Cli/Commands/DoCommand.cs | Uses pipeline-specific log-level option when forwarding to AppHost. |
| src/Aspire.Cli/Commands/DestroyCommand.cs | Uses pipeline-specific log-level option when forwarding to AppHost. |
| src/Aspire.Cli/Commands/DeployCommand.cs | Uses pipeline-specific log-level option when forwarding to AppHost. |
Copilot's findings
Files not reviewed (2)
- src/Aspire.Cli/Resources/DestroyCommandStrings.Designer.cs: Language not supported
- src/Aspire.Dashboard/Resources/ControlsStrings.Designer.cs: Language not supported
- Files reviewed: 126/132 changed files
- Comments generated: 3
| services.AddSingleton<IAppHostServerProjectFactory, AppHostServerProjectFactory>(); | ||
| services.AddSingleton(options.AppHostServerSessionFactory); | ||
| services.AddSingleton<ILanguageDiscovery, DefaultLanguageDiscovery>(); | ||
| services.AddSingleton(options.LanguageServiceFactory); | ||
| services.AddSingleton<TemplateNuGetConfigService>(); | ||
|
|
| await auto.TypeAsync( | ||
| $"DASHBOARD_URL=$(sed -n " + | ||
| "'s/.*\"dashboardUrl\"[[:space:]]*:[[:space:]]*\"\\(https\\?:\\/\\/localhost:[0-9]*\\).*/\\1/p' " + | ||
| "'s/.*\"dashboardUrl\"[[:space:]]*:[[:space:]]*\"\\(https\\?:\\/\\/[a-z.]*localhost:[0-9]*\\).*/\\1/p' " + | ||
| $"\"{jsonFile}\" | head -1)"); |
| var repoRoot = CliE2ETestHelpers.GetRepoRoot(); | ||
| var strategy = CliInstallStrategy.Detect(output.WriteLine); | ||
| var workspace = TemporaryWorkspace.Create(output); | ||
|
|
||
| using var terminal = CliE2ETestHelpers.CreateDockerTestTerminal(repoRoot, strategy, output, mountDockerSocket: true, workspace: workspace); | ||
|
|
|
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.
Matched test failure patterns (50 tests)
|
|
❓ CLI E2E Tests unknown — 95 passed, 0 failed, 5 unknown (commit View all recordings
📹 Recordings uploaded automatically from CI run #26193420935 |
|
✅ No documentation update needed. docs_required → already documented by name on This PR is a back-merge of the
|
This PR replaces #17139 with a much smaller, reviewable back-merge of the v13.3 release into
main.Background
The original PR (#17139) showed 527 file changes / 24K insertions — a misleading three-dot diff that included all release-branch commits since the v13.3 branch point, including ~36 backports whose content was already on main with different commit SHAs. That made it impractical to review.
This PR is rebuilt from the
v13.3.4tag (so it intentionally excludes the still-unreleased 13.3.5 work that sits onrelease/13.3), with conflict resolution applied to keepmainon the 13.4.0 unstable build.Resolution policy
eng/Versions.props,eng/Version.Details.xml,Directory.Packages.Helix.props, polyglottest-*-playground.sh,ci.yml, pipeline YAMLs, Kubernetes E2E[ActiveIssue]tagsmain— keep main unstable at 13.4.0; do not stabilize, do not pin Helix packages, do not skip kubernetes E2E for the stabilization gapsrc/*/api/*.csandsrc/*/api/*.txtv13.3.4— bring forward the regenerated public API baseline so main reflects shipped 13.3 APIsmain— main has forward-progress on top of the backported code; backport content already exists on main with different SHAsmain— main snapshots reflect main's current code generatorsWhat ends up flowing to main
DashboardCommandExecutor.csandNotificationEntryComponent.razor.csbut auto-merged the release-onlyINotificationService.cschange toOnClick = Func<IServiceProvider, Task>. This commit threads the new signature through the call sites on main while preserving main'sFluentMessageIntentrename andDialog.Hide/Showwrapping.s_logLevelOption→s_pipelineLogLevelOptionon release.PipelineCommandBase.cspicked up the rename via the merge;DestroyCommand.cswas conflicted (also took main's--yesvalidation from [release/13.3] Require --yes with --non-interactive for destroy cmd #16806), so it still referenced the old name. Also renamesExitCodeConstants→CliExitCodesinTelemetryTracesCommandTests.csto match a rename that happened on main.What does NOT flow to main (intentionally)
StabilizePackageVersion=trueflip and all13.3.0 → 13.3.4patch version bumps (Bump patch version from 13.3.0 to 13.3.1 #16951, Bump patch version from 13.3.1 to 13.3.2 #17053, Bump patch version from 13.3.2 to 13.3.3 #17088, [release/13.3] Bump patch version from 13.3.3 to 13.3.4 #17215).Directory.Packages.Helix.props).compute_version_suffixremoval inci.yml.test-{java,python,typescript}-playground.sh.[ActiveIssue(#15335)]tags onKubernetesDeploy*Tests.release/13.3after v13.3.4 (those will flow back in a future "merge 13.3.5 to main" PR after 13.3.5 ships): [release/13.3] Skip log publish for WinGet/Homebrew installer jobs #17134, [release/13.3] Stop forcing MSBuild server for Aspire CLI builds #17314, [release/13.3] Fix Azure provisioning resource group location prompt #17291, and the 13.3.5 version bump.Validation
./build.cmd /p:SkipNativeBuild=truesucceeds.DestroyCommandTests,DoCommandTests,TelemetryLogsCommandTests,TelemetryTracesCommandTestsall pass (56/56).Closes #17139.