Orkestrér frontends, APIs, containere og databaser ubesværet—ingen omskrivninger, ingen grænser. Udvid Aspire til at drive ethvert projekt.
image: diff --git a/src/frontend/src/content/docs/dashboard/explore.mdx b/src/frontend/src/content/docs/dashboard/explore.mdx index 53c5cb0f9..d1726d0e0 100644 --- a/src/frontend/src/content/docs/dashboard/explore.mdx +++ b/src/frontend/src/content/docs/dashboard/explore.mdx @@ -579,13 +579,17 @@ Selecting **View response** opens the text visualizer with the command's resultOrchestriere Frontends, APIs, Container und Datenbanken mühelos—ohne Umschreiben, ohne Grenzen. Erweitere Aspire, um jedes Projekt anzutreiben.
image: diff --git a/src/frontend/src/content/docs/deployment/kubernetes.mdx b/src/frontend/src/content/docs/deployment/kubernetes.mdx index 1985873d1..003f03f72 100644 --- a/src/frontend/src/content/docs/deployment/kubernetes.mdx +++ b/src/frontend/src/content/docs/deployment/kubernetes.mdx @@ -50,6 +50,8 @@ When you publish or deploy, Aspire translates your application model into Kubern | Endpoints | Services | | Volumes | PersistentVolumes and PersistentVolumeClaims | +For durable storage that you model as first-class resources and bind to workloads, see [Persistent volumes on Kubernetes](/deployment/kubernetes/persistent-volumes/). + ## Publish vs deploy Both Kubernetes targets support `aspire publish`. The key difference is whether the target also supports `aspire deploy`: @@ -91,4 +93,9 @@ For more on the pipeline model and how publish and deploy relate, see [Pipelines description="Install pre-existing Helm charts alongside your application using AddHelmChart." href="/deployment/kubernetes/helm-charts/" /> +Orquesta frontends, APIs, contenedores y bases de datos sin esfuerzo—sin reescrituras, sin límites. Extiende Aspire para impulsar cualquier proyecto.
image: diff --git a/src/frontend/src/content/docs/extensibility/interaction-service.mdx b/src/frontend/src/content/docs/extensibility/interaction-service.mdx index 58b971a11..66b230947 100644 --- a/src/frontend/src/content/docs/extensibility/interaction-service.mdx +++ b/src/frontend/src/content/docs/extensibility/interaction-service.mdx @@ -1,10 +1,10 @@ --- -title: Interaction service (Preview) -seoTitle: Aspire interaction service (Preview) for AppHost authors +title: Interaction service +seoTitle: Aspire interaction service for AppHost authors description: Use the Aspire interaction service to prompt users for input, request confirmation, and display messages from AppHost extensions, integrations, and custom resources. --- -import { Aside, Steps } from '@astrojs/starlight/components'; +import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components'; import { Image } from 'astro:assets'; import messageDialog from '@assets/extensibility/interaction-service-message-dialog.png'; import messageBar from '@assets/extensibility/interaction-service-message-bar.png'; @@ -13,7 +13,7 @@ import multipleInput from '@assets/extensibility/interaction-service-multiple-in import multipleInputFilled from '@assets/extensibility/interaction-service-multiple-input-filled.png'; import multipleInputLogs from '@assets/extensibility/interaction-service-multiple-input-logs.png'; -The interaction service (`Aspire.Hosting.IInteractionService`) allows you to prompt users for input, request confirmation, and display messages. The interaction service works in two different contexts: +The interaction service (`Aspire.Hosting.IInteractionService`) allows you to prompt users for input, request confirmation, and display messages. It works in two different contexts: - **Aspire dashboard**: When running `aspire run` or launching the AppHost directly, interactions appear as dialogs and notifications in the dashboard UI. - **Aspire CLI**: When running `aspire publish` or `aspire deploy`, interactions are prompted through the command-line interface. @@ -22,19 +22,18 @@ This is useful for scenarios where you need to gather information from the user - ## The `IInteractionService` API -The `IInteractionService` interface is retrieved from the `DistributedApplication` dependency injection container. `IInteractionService` can be injected into types created from DI or resolved from `IServiceProvider`, which is usually available on a context argument passed to events. +The `IInteractionService` interface provides methods for prompting users. In C#, it's retrieved from the dependency injection container. In TypeScript, it's resolved from the command context's service provider. Always check if the service is available before use — if you attempt to call a method when it's not available, an exception is thrown. For example, the interaction service isn't available when a command is triggered from the CLI. -When you request `IInteractionService`, be sure to check if it's available for usage. If you attempt to use the interaction service when it's not available (`IInteractionService.IsAvailable` returns `false`), an exception is thrown. For example, the interaction service isn't available when a command is triggered from the CLI. +Orchestrez vos frontends, APIs, conteneurs et bases de données sans effort — sans réécriture, sans limites. Étendez Aspire pour propulser n'importe quel projet.
image: diff --git a/src/frontend/src/content/docs/fundamentals/custom-resource-commands.mdx b/src/frontend/src/content/docs/fundamentals/custom-resource-commands.mdx index 288af9e1b..4ce592584 100644 --- a/src/frontend/src/content/docs/fundamentals/custom-resource-commands.mdx +++ b/src/frontend/src/content/docs/fundamentals/custom-resource-commands.mdx @@ -156,7 +156,7 @@ The `WithCommand` API adds the appropriate annotations to the resource, which ar - `displayName`: The name of the command to display in the dashboard. - `executeCommand`: The callback that runs when the command is invoked. In C# the type is `Funcफ्रंटएंड, API, कंटेनर और डेटाबेस को आसानी से ऑर्केस्ट्रेट करें—बिना रीराइट, बिना सीमा। किसी भी प्रोजेक्ट को शक्ति देने के लिए Aspire को विस्तारित करें।
image: diff --git a/src/frontend/src/content/docs/id/index.mdx b/src/frontend/src/content/docs/id/index.mdx index 5e73b900b..c692b12be 100644 --- a/src/frontend/src/content/docs/id/index.mdx +++ b/src/frontend/src/content/docs/id/index.mdx @@ -11,7 +11,7 @@ prev: false next: false banner: content: | - 🚀 Aspire 13.4 telah dirilis! — Lihat apa yang baru di Aspire 13.4. + ✨ Aspire 13.5 telah dirilis! — Lihat apa yang baru di Aspire 13.5. hero: tagline: Stack Anda, disederhanakan.Orkestrasi frontend, API, container, dan database dengan mudah—tanpa menulis ulang, tanpa batasan. Perluas Aspire untuk mendukung proyek apa pun.
image: diff --git a/src/frontend/src/content/docs/index.mdx b/src/frontend/src/content/docs/index.mdx index f0fe93528..dc6fee6c5 100644 --- a/src/frontend/src/content/docs/index.mdx +++ b/src/frontend/src/content/docs/index.mdx @@ -11,7 +11,7 @@ prev: false next: false banner: content: | - Aspire 13.4 is here! — See what's new + ✨ Aspire 13.5 is available! — Explore the latest features and improvements hero: tagline: Your stack, streamlined.Orchestrate frontends, APIs, containers, and databases effortlessly—no rewrites, no limits. Extend Aspire to power any project. Free, open-source, and agent ready.
image: diff --git a/src/frontend/src/content/docs/integrations/ai/github-models/github-models-connect.mdx b/src/frontend/src/content/docs/integrations/ai/github-models/github-models-connect.mdx index f62b055b7..7b68bd694 100644 --- a/src/frontend/src/content/docs/integrations/ai/github-models/github-models-connect.mdx +++ b/src/frontend/src/content/docs/integrations/ai/github-models/github-models-connect.mdx @@ -19,6 +19,10 @@ import githubIcon from '@assets/icons/github-icon.png'; data-zoom-off /> +:::caution[Integration deprecated] +The GitHub Models service is **no longer available to new customers**. The `Aspire.Hosting.GitHub.Models` integration is sunset as of Aspire 13.5. All public APIs are marked `[Obsolete]` and the package no longer appears in `aspire add` output. The package will ship one final obsolete release on NuGet and will be removed entirely in a future version. For new and existing apps, use the [Azure AI Foundry integration](/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-get-started/) instead, which provides access to a broad catalog of models — including OpenAI's GPT models — and supports local development with `RunAsFoundryLocal()`. See [microsoft/aspire#18402](https://github.com/microsoft/aspire/issues/18402) for details. +::: + This page describes how consuming apps connect to a GitHub Model resource that's already modeled in your AppHost. For the AppHost API surface — adding a model resource, API key parameters, organization configuration, and health checks — see [GitHub Models hosting integration](../github-models-host/). When you reference a GitHub Model resource from your AppHost, Aspire injects the connection information into the consuming app as environment variables. Your app can either read those environment variables directly — the pattern works the same from any language — or, in C#, use the Aspire client integrations for automatic dependency injection, health checks, and telemetry. diff --git a/src/frontend/src/content/docs/integrations/ai/github-models/github-models-get-started.mdx b/src/frontend/src/content/docs/integrations/ai/github-models/github-models-get-started.mdx index be3d232f2..e78f6db59 100644 --- a/src/frontend/src/content/docs/integrations/ai/github-models/github-models-get-started.mdx +++ b/src/frontend/src/content/docs/integrations/ai/github-models/github-models-get-started.mdx @@ -17,6 +17,10 @@ import githubIcon from '@assets/icons/github-icon.png'; data-zoom-off /> +:::caution[Integration deprecated] +The GitHub Models service is **no longer available to new customers**. The `Aspire.Hosting.GitHub.Models` integration is sunset as of Aspire 13.5. All public APIs are marked `[Obsolete]` and the package no longer appears in `aspire add` output. The package will ship one final obsolete release on NuGet and will be removed entirely in a future version. For new and existing apps, use the [Azure AI Foundry integration](/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-get-started/) instead, which provides access to a broad catalog of models — including OpenAI's GPT models — and supports local development with `RunAsFoundryLocal()`. See [microsoft/aspire#18402](https://github.com/microsoft/aspire/issues/18402) for details. +::: + [GitHub Models](https://github.com/marketplace/models) provides access to a broad catalog of AI models — including OpenAI's GPT models, DeepSeek, Microsoft's Phi models, and more — through GitHub's infrastructure and your existing GitHub token. The Aspire GitHub Models integration lets you model a GitHub Model resource as a first-class resource in your AppHost, then hand the connection information to any consuming app — regardless of language. ## Why use GitHub Models with Aspire diff --git a/src/frontend/src/content/docs/integrations/ai/github-models/github-models-host.mdx b/src/frontend/src/content/docs/integrations/ai/github-models/github-models-host.mdx index a9053fabd..ff423f159 100644 --- a/src/frontend/src/content/docs/integrations/ai/github-models/github-models-host.mdx +++ b/src/frontend/src/content/docs/integrations/ai/github-models/github-models-host.mdx @@ -17,6 +17,10 @@ import githubIcon from '@assets/icons/github-icon.png'; data-zoom-off /> +:::caution[Integration deprecated] +The GitHub Models service is **no longer available to new customers**. The `Aspire.Hosting.GitHub.Models` integration is sunset as of Aspire 13.5. All public APIs are marked `[Obsolete]` and the package no longer appears in `aspire add` output. The package will ship one final obsolete release on NuGet and will be removed entirely in a future version. For new and existing apps, use the [Azure AI Foundry integration](/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-get-started/) instead, which provides access to a broad catalog of models — including OpenAI's GPT models — and supports local development with `RunAsFoundryLocal()`. See [microsoft/aspire#18402](https://github.com/microsoft/aspire/issues/18402) for details. +::: + This article is the reference for the Aspire GitHub Models hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model GitHub Model resources in your [`AppHost`](/get-started/app-host/) project. If you're new to the GitHub Models integration, start with the [Get started with GitHub Models integrations](/integrations/ai/github-models/github-models-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to GitHub Models](../github-models-connect/). diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-host.mdx index 606e9fff3..eb0d27c5b 100644 --- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-host.mdx +++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-host.mdx @@ -188,7 +188,7 @@ The preceding code: - Adds an Azure AI Foundry resource named `foundry`. - Adds a Foundry deployment resource named `chat` using the generated `FoundryModel.OpenAI.Gpt5Mini` descriptor. -If you need a different generated model descriptor, use the corresponding nested type, such as `FoundryModel.Microsoft.Phi4Reasoning`: +If you need a different generated model descriptor, use the corresponding nested type. The `FoundryModel` class organizes models by provider family: `FoundryModel.Microsoft`, `FoundryModel.OpenAI`, `FoundryModel.Cohere`, `FoundryModel.MistralAI`, and others. For example, to use `FoundryModel.Microsoft.Phi4Reasoning`:Orchestra frontend, API, container e database senza sforzo—senza riscritture, senza limiti. Estendi Aspire per potenziare qualsiasi progetto.
image: diff --git a/src/frontend/src/content/docs/ja/docs.mdx b/src/frontend/src/content/docs/ja/docs.mdx index 280f120bf..4c4eb100c 100644 --- a/src/frontend/src/content/docs/ja/docs.mdx +++ b/src/frontend/src/content/docs/ja/docs.mdx @@ -7,7 +7,7 @@ next: description: Aspire を使って、C#、TypeScript、JavaScript、Python などの分散アプリケーションを設計・実行・観測・デプロイする方法を学べます。 banner: content: | - 🆕 Aspire 13.4 が登場! — 新機能を見る + 🆕 Aspire 13.5 が登場! — 新機能を見る editUrl: false tableOfContents: false pageActions: false diff --git a/src/frontend/src/content/docs/ja/index.mdx b/src/frontend/src/content/docs/ja/index.mdx index c3bbec264..b58265ffa 100644 --- a/src/frontend/src/content/docs/ja/index.mdx +++ b/src/frontend/src/content/docs/ja/index.mdx @@ -11,7 +11,7 @@ prev: false next: false banner: content: | - Aspire 13.4 が登場しました! — 新機能を見る + ✨ Aspire 13.5 が登場しました! — 新機能を見る hero: tagline: あなたのスタックをもっとシンプルに。フロントエンド、API、コンテナ、データベースを再実装不要、制限なしでオーケストレーションします。Aspire を拡張してあらゆるプロジェクトを強化しましょう。
image: diff --git a/src/frontend/src/content/docs/ko/index.mdx b/src/frontend/src/content/docs/ko/index.mdx index d7100f8f7..d3a36ce42 100644 --- a/src/frontend/src/content/docs/ko/index.mdx +++ b/src/frontend/src/content/docs/ko/index.mdx @@ -11,7 +11,7 @@ prev: false next: false banner: content: | - 🚀 Aspire 13.4이 출시되었습니다! — Aspire 13.4의 새로운 기능 확인하기. + ✨ Aspire 13.5이 출시되었습니다! — Aspire 13.5의 새로운 기능 확인하기. hero: tagline: 당신의 스택, 단순화.프론트엔드, API, 컨테이너, 데이터베이스를 손쉽게 오케스트레이션—재작성 불필요, 무한한 가능성. Aspire를 확장하여 모든 프로젝트를 강화하세요.
image: diff --git a/src/frontend/src/content/docs/pt-br/index.mdx b/src/frontend/src/content/docs/pt-br/index.mdx index 44f44d8be..d9ff948c3 100644 --- a/src/frontend/src/content/docs/pt-br/index.mdx +++ b/src/frontend/src/content/docs/pt-br/index.mdx @@ -11,7 +11,7 @@ prev: false next: false banner: content: | - 🚀 Aspire 13.4 foi lançado! — Veja o que há de novo no Aspire 13.4. + ✨ Aspire 13.5 foi lançado! — Veja o que há de novo no Aspire 13.5. hero: tagline: Seu stack, simplificado.Orquestre frontends, APIs, contêineres e bancos de dados sem esforço—sem reescritas, sem limites. Estenda o Aspire para impulsionar qualquer projeto.
image: diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-doctor.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-doctor.mdx index d6880337d..f4a01d06f 100644 --- a/src/frontend/src/content/docs/reference/cli/commands/aspire-doctor.mdx +++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-doctor.mdx @@ -33,7 +33,7 @@ This command is useful for troubleshooting when you encounter issues with Aspire - **AppHost checks**: Reports the AppHost Aspire SDK version when an AppHost project is present in the current directory - **SDK checks**: Verifies .NET SDK installation and version requirements - **Container checks**: Validates container runtime (Docker and/or Podman) availability, running status, and version. Reports which runtime is active and why (explicit configuration, auto-detected default, or auto-detected only runtime running) -- **Environment checks**: Validates environment variables and other settings, including the JavaScript toolchain required by TypeScript AppHosts (npm, pnpm, Yarn, or Bun) +- **Environment checks**: Reports operating system information (type, version, and Linux distro details when available) and validates environment variables and other settings, including the JavaScript toolchain required by TypeScript AppHosts (npm, pnpm, Yarn, or Bun) The command displays results with clear status indicators: @@ -88,10 +88,10 @@ Aspire Environment Check ======================== Aspire - ✅ Aspire CLI version 13.4.0 + ✅ Aspire CLI version %ASPIRE_VERSION% AppHost - ✅ AppHost version 13.4.0 (MyApp.AppHost.csproj) + ✅ AppHost version %ASPIRE_VERSION% (MyApp.AppHost.csproj) .NET SDK ✅ .NET 10.0.203 installed (arm64) @@ -100,9 +100,10 @@ Container Runtime ✅ Docker v28.5.1: running (auto-detected (default)) ← active Environment + ✅ Operating system: macOS 15.5.0 ✅ HTTPS development certificate is trusted -Summary: 5 passed, 0 warnings, 0 failed +Summary: 6 passed, 0 warnings, 0 failed ``` After the summary, table output also includes an `Aspire CLI Installations` @@ -113,11 +114,11 @@ When the CLI is out of date, the Aspire section shows a warning with the latest ```bash title="Aspire CLI" Aspire - ⚠️ Aspire CLI version 13.4.0-dev is out of date. Latest version is 13.4.0-preview.1.26262.10 + ⚠️ Aspire CLI version %ASPIRE_VERSION%-dev is out of date. Latest version is %ASPIRE_VERSION%-preview.1.26262.10 Run 'aspire update' to update Aspire CLI. AppHost - ✅ AppHost version 13.4.0 (MyApp.AppHost.csproj) + ✅ AppHost version %ASPIRE_VERSION% (MyApp.AppHost.csproj) ``` This warning snippet is abbreviated. In complete table output, a summary follows @@ -167,19 +168,31 @@ When using the `--format Json` option, the output includes a structured response "category": "aspire", "name": "cli-version", "status": "pass", - "message": "Aspire CLI version 13.4.0", + "message": "Aspire CLI version %ASPIRE_VERSION%", "metadata": { - "currentVersion": "13.4.0" + "currentVersion": "%ASPIRE_VERSION%" } }, { "category": "apphost", "name": "apphost-version", "status": "pass", - "message": "AppHost version 13.4.0 (MyApp.AppHost.csproj)", + "message": "AppHost version %ASPIRE_VERSION% (MyApp.AppHost.csproj)", "metadata": { "appHostPath": "MyApp.AppHost.csproj", - "version": "13.4.0" + "version": "%ASPIRE_VERSION%" + } + }, + { + "category": "environment", + "name": "operating-system", + "status": "pass", + "message": "Operating system: Linux Ubuntu 24.04", + "metadata": { + "osType": "Linux", + "displayName": "Linux Ubuntu", + "version": "24.04", + "description": "Ubuntu 24.04.2 LTS" } }, { @@ -190,7 +203,7 @@ When using the `--format Json` option, the output includes a structured response } ], "summary": { - "passed": 5, + "passed": 6, "warnings": 0, "failed": 0 } @@ -204,17 +217,26 @@ When the CLI is out of date, the `cli-version` check has `"status": "warning"` a "category": "aspire", "name": "cli-version", "status": "warning", - "message": "Aspire CLI version 13.4.0-dev is out of date. Latest version is 13.4.0-preview.1.26262.10", + "message": "Aspire CLI version %ASPIRE_VERSION%-dev is out of date. Latest version is %ASPIRE_VERSION%-preview.1.26262.10", "fix": "Run 'aspire update' to update Aspire CLI.", "metadata": { - "currentVersion": "13.4.0-dev", - "latestVersion": "13.4.0-preview.1.26262.10" + "currentVersion": "%ASPIRE_VERSION%-dev", + "latestVersion": "%ASPIRE_VERSION%-preview.1.26262.10" } } ``` The `apphost-version` check is only present in the JSON output when an AppHost project is discovered in the current directory. +The `operating-system` check is always present and includes the following metadata fields: + +| Field | Description | +| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `osType` | The platform family: `Windows`, `macOS`, or `Linux`. | +| `displayName` | A human-readable OS name, for example `Windows`, `macOS`, or `Linux Ubuntu`. | +| `version` | The OS version string. On Linux this is the `VERSION_ID` from `/etc/os-release` when available; on Windows and macOS it is the value from `Environment.OSVersion`. | +| `description` | A longer description of the OS. On Linux this is the `PRETTY_NAME` value from `/etc/os-release` (for example `Ubuntu 24.04.2 LTS`); on other platforms it is the runtime OS description string. | + ## See also - [aspire command](../aspire/) diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-init.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-init.mdx index 7981425e4..995e6a287 100644 --- a/src/frontend/src/content/docs/reference/cli/commands/aspire-init.mdx +++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-init.mdx @@ -102,6 +102,14 @@ The following options are available: The AppHost language to scaffold (`csharp`, `typescript`). +- **`--skill-locations)`, or `host unreachable`. |
+| `Size` | The current terminal grid size (`columns`x`rows`). |
+| `Peers` | The number of peers currently attached to the replica. |
+| `Restarts` | The number of times the replica's terminal host has restarted. |
+
+## Options
+
+The following options are available:
+
+-
+
+- **`--format `**
+
+ Output format. `text` (default) renders a table; `json` emits structured output for scripting. The JSON output is an array of terminal entries with `resourceName`, `displayName`, `configuredColumns`, `configuredRows`, `isHostReachable`, and a `replicas` array. Each replica includes `replicaIndex`, `isAlive`, `exitCode`, `producerConnected`, `restartCount`, `currentColumns`, `currentRows`, and `attachedPeerCount`. When `--verbose` is set, each replica also includes a `peers` array of `{ peerId, displayName }`.
+
+- **`-v, --verbose`**
+
+ Include per-peer details for every attached viewer (peer id and display name).
+
+-
+
+-
+
+-
+
+-
+
+-
+
+-
+
+## Examples
+
+- List terminal sessions in the running AppHost:
+
+ ```bash title="Aspire CLI"
+ aspire terminal ps
+ ```
+
+ Example output:
+
+ ```text title="Output"
+ Resource Replica Status Size Peers Restarts
+ agent 0 alive 120x30 1 0
+ ```
+
+- Include per-peer details:
+
+ ```bash title="Aspire CLI"
+ aspire terminal ps --verbose
+ ```
+
+- Emit JSON for scripting and pipe to `jq`:
+
+ ```bash title="Aspire CLI"
+ aspire terminal ps --format json | jq -c '.[] | { resourceName, isHostReachable }'
+ ```
+
+## See also
+
+- [Test TUI and shell apps using WithTerminal](/app-host/with-terminal/)
+- [aspire terminal command](/reference/cli/commands/aspire-terminal/)
+- [aspire terminal attach command](/reference/cli/commands/aspire-terminal-attach/)
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-terminal.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-terminal.mdx
new file mode 100644
index 000000000..bf2861d06
--- /dev/null
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-terminal.mdx
@@ -0,0 +1,62 @@
+---
+title: aspire terminal command
+seoTitle: aspire terminal command reference for the Aspire CLI
+description: Learn about the aspire terminal command, which lists and attaches to interactive terminal sessions for resources registered using WithTerminal.
+sidebar:
+ badge: Preview
+---
+
+import Include from '@components/Include.astro';
+
+## Name
+
+`aspire terminal` - Manage interactive terminal sessions for resources.
+
+## Synopsis
+
+```bash title="Aspire CLI"
+aspire terminal [command] [options]
+```
+
+## Description
+
+The `aspire terminal` command provides subcommands for working with interactive terminal sessions exposed by resources that were registered using [`WithTerminal()`](/app-host/with-terminal/) in the AppHost. You can list which resources have a terminal and attach your local terminal to a running session.
+
+Because `WithTerminal` is experimental, the `aspire terminal` command group is hidden behind a feature flag. Enable it before use:
+
+```bash title="Enable the aspire terminal commands"
+aspire config set features.terminalCommandsEnabled true
+```
+
+The connected AppHost must advertise the `terminals.v1` capability (Aspire.Hosting 13.4 or later). Against an older AppHost the subcommands report that terminals are not supported.
+
+## Options
+
+The following options are available:
+
+-
+
+-
+
+-
+
+-
+
+-
+
+-
+
+## Commands
+
+The following commands are available:
+
+| Command | Function |
+| ---------------------------------------------------------- | -------------------------------------------------------------- |
+| [`aspire terminal attach`](../aspire-terminal-attach/) | Attach the local terminal to a resource's interactive session. |
+| [`aspire terminal ps`](../aspire-terminal-ps/) | List interactive terminal sessions in the connected AppHost. |
+
+## See also
+
+- [Test TUI and shell apps using WithTerminal](/app-host/with-terminal/)
+- [aspire terminal attach command](../aspire-terminal-attach/)
+- [aspire terminal ps command](../aspire-terminal-ps/)
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-update.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-update.mdx
index e0466e41d..6037ab3c1 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-update.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-update.mdx
@@ -79,6 +79,15 @@ To update the CLI without being prompted, run `aspire update --self` before runn
- When the CLI was installed with the **install script** or another **binary install**, `aspire update --self` downloads and installs the latest CLI binary directly.
- When the CLI was installed as a **.NET tool**, the command prints the `dotnet tool update` command to run.
+- When the CLI was installed via **Nix** (profile or flake), the command prints the Nix update commands to run instead of downloading a new binary. Because the Nix store is read-only, in-place binary updates are not possible:
+
+ ```text title="Output"
+ To update the Aspire CLI when installed from Nix, update the profile package or flake input:
+ nix profile upgrade aspire-cli
+ nix flake update
+ ```
+
+ Run `nix profile upgrade aspire-cli` for a profile install, or `nix flake update ` for a project flake.
## Options
diff --git a/src/frontend/src/content/docs/reference/cli/microsoft-collected-cli-telemetry.mdx b/src/frontend/src/content/docs/reference/cli/microsoft-collected-cli-telemetry.mdx
index 48c954dbd..ef3c17590 100644
--- a/src/frontend/src/content/docs/reference/cli/microsoft-collected-cli-telemetry.mdx
+++ b/src/frontend/src/content/docs/reference/cli/microsoft-collected-cli-telemetry.mdx
@@ -11,6 +11,12 @@ The Aspire CLI collects usage telemetry to help Microsoft improve the product. T
Aspire CLI telemetry is collected when using the CLI to run commands. Telemetry is gathered during normal CLI usage, unless you have [opted out](#how-to-opt-out) of telemetry collection.
+### AI agent skill usage
+
+When you run `aspire agent init`, Aspire installs Aspire's AI skills and a `PostToolUse` hook into each detected agent client's user-level configuration (for example, GitHub Copilot CLI and Claude Code). The hook lets Aspire understand which of its AI skills and tools are actually used so the team can invest in the most valuable ones.
+
+After each agent tool use, the hook checks if an **Aspire** skill, Aspire MCP tool, or Aspire skill reference file was involved. If so, the hook inspects the event and forwards a low-cardinality usage event to the hidden `aspire agent telemetry` command. The command records the event through the same CLI telemetry pipeline. Tool uses that don't involve Aspire skills or tools are ignored. See [AI agent skill usage data](#ai-agent-skill-usage-data) for exactly what's recorded.
+
## How to opt-out
To opt-out of telemetry collection, set the `ASPIRE_CLI_TELEMETRY_OPTOUT` environment variable to `true`. This will disable telemetry collection for all CLI commands:
@@ -49,6 +55,30 @@ Aspire CLI collects the following data:
| 13.2 | CLI launch. | Includes command name and exit code. Option and argument values are not sent to Microsoft. |
| 13.2 | Ensure .NET SDK install. | Includes .NET SDK version installed. |
| 13.2 | CLI-related unhandled exceptions. | — |
+| 13.5 | Coding agent detection. | When the CLI is invoked from a known coding agent environment (such as GitHub Copilot, Claude, Cursor, or others), the detected agent name is recorded. Only the known agent name is sent — no environment variable values or other identifying data are included. This data point is omitted entirely when no known coding agent is detected. |
+| 13.5 | AI agent skill usage. | Recorded only for Aspire's own skills and tools. See [AI agent skill usage data](#ai-agent-skill-usage-data). |
+
+### AI agent skill usage data
+
+The agent telemetry hook installed by `aspire agent init` reports a single event each time one of Aspire's own AI skills or tools is used. Three event types are reported:
+
+- `skill_invocation` — an Aspire skill was invoked, or its `SKILL.md` was read.
+- `tool_invocation` — an Aspire MCP tool was called.
+- `reference_file_read` — a reference file bundled alongside an Aspire skill was read.
+
+Each event records only a subset of the following low-cardinality, Aspire-owned values (depending on the event type):
+
+| Field | Description |
+|-------|-------------|
+| Event type | One of `skill_invocation`, `tool_invocation`, or `reference_file_read`. |
+| Client name | The agent client that produced the event, for example `copilot-cli`, `claude-code`, or `vscode`. |
+| Session ID | The agent session identifier (an opaque GUID), used to group events from one session. |
+| Skill name | The Aspire skill name, matched against the fixed list of skills Aspire ships (for example `aspire-deployment`). |
+| Tool name | The Aspire MCP tool name (for example `aspire-list_resources`). |
+| File reference | The skill-relative path of a reference file, for example `aspire/references/deploy.md`. |
+| Event timestamp | The UTC time the event occurred. |
+
+To protect your privacy, the hook only forwards an event when the skill or tool name matches the fixed set Aspire ships, and a file reference is reported only as the path **after** the skill folder. Absolute paths, repository names, user names, file contents, and tool arguments are never recorded. Before sending, the `aspire agent telemetry` command validates each value, discards anything it doesn't recognize, and honors the same `ASPIRE_CLI_TELEMETRY_OPTOUT` opt-out.
## See also
diff --git a/src/frontend/src/content/docs/reference/cli/search-filter.mdx b/src/frontend/src/content/docs/reference/cli/search-filter.mdx
index a9f4f514a..d3cc7054c 100644
--- a/src/frontend/src/content/docs/reference/cli/search-filter.mdx
+++ b/src/frontend/src/content/docs/reference/cli/search-filter.mdx
@@ -28,10 +28,28 @@ Search queries support free-text fragments, field qualifiers, attribute qualifie
| `field:"value with spaces"` | Quoted field qualifier value | `message:"connection failed"` |
| `@attr:value` | Attribute qualifier — matches custom span/log attributes | `@http.method:GET` |
| `-field:value` / `-@attr:value` | Negated qualifier — excludes matches | `-severity:debug` |
-| `field:>N` / `field:>=N` / `field:100` |
+| `field:>value` / `field:>=value` / `field:100` |
All terms are AND'd: every fragment and qualifier must independently match.
+## Timestamp qualifier
+
+Use the `timestamp` field qualifier to narrow structured logs, traces, and spans to a specific date/time range. The qualifier accepts ISO 8601 date or date/time strings together with a comparison operator:
+
+```bash title="Aspire CLI"
+aspire otel logs --search "timestamp:>2026-01-15T09:30:00"
+aspire otel traces --search "timestamp:<=2026-06-01T12:00:00Z"
+aspire otel spans --search "timestamp:>=2026-01-01 timestamp:<2027-01-01"
+```
+
+The supported comparison operators are `>`, `>=`, `<`, and `<=`.
+
+Timestamp values are internally stored in UTC. The `timestamp` value is converted to UTC using these timezone rules:
+
+- A value with no timezone suffix (for example `2026-01-15` or `2026-01-15T09:30:00`) is treated as local time on the dashboard server and adjusted to UTC before comparison.
+- A value with a UTC offset (for example `2026-06-01T12:00:00+05:00`) is adjusted to UTC before comparison.
+- A value with the `Z` suffix is treated as UTC directly.
+
## Console logs
Matches against log line text content and resource name. Only free-text is supported (no structured qualifiers).
@@ -45,36 +63,39 @@ aspire logs --follow --search "\"connection error\""
Supports free-text and structured qualifiers. Free-text matches against message, resource name, scope, trace/span IDs, severity, and all attribute keys/values.
-Available field qualifiers: `severity`, `resource`, `scope`, `message`, `trace-id`, `span-id`, `event`.
+Available field qualifiers: `severity`, `resource`, `scope`, `message`, `trace-id`, `span-id`, `event`, `timestamp`.
```bash title="Aspire CLI"
aspire otel logs --search "severity:error \"connection failed\""
aspire otel logs --search "resource:api -severity:debug"
aspire otel logs --search "scope:Microsoft.EntityFrameworkCore"
+aspire otel logs --search "timestamp:>=2026-06-01T12:00:00 severity:error"
```
## Traces
Supports free-text and structured qualifiers. Free-text matches against trace name, resource name, and all span fields within the trace.
-Available field qualifiers: `name`, `resource`, `trace-id`, `status`, `duration`.
+Available field qualifiers: `name`, `resource`, `trace-id`, `status`, `duration`, `timestamp`.
```bash title="Aspire CLI"
aspire otel traces --search "checkout"
aspire otel traces --search "status:error duration:>500"
aspire otel traces --search "@http.status_code:500"
+aspire otel traces --search "timestamp:>2026-01-15T09:30:00 status:error"
```
## Spans
Supports free-text and structured qualifiers. Free-text matches against span name, resource name, scope, trace/span IDs, status, kind, and all attribute keys/values.
-Available field qualifiers: `name`, `resource`, `scope`, `status`, `kind`, `trace-id`, `span-id`, `duration`.
+Available field qualifiers: `name`, `resource`, `scope`, `status`, `kind`, `trace-id`, `span-id`, `duration`, `timestamp`.
```bash title="Aspire CLI"
aspire otel spans --search "@http.method:GET duration:>100 status:error"
aspire otel spans --search "@db.system:postgresql"
aspire otel spans --search "-kind:internal"
+aspire otel spans --search "timestamp:>=2026-03-01T08:30:00 kind:server"
```
## See also
diff --git a/src/frontend/src/content/docs/ru/index.mdx b/src/frontend/src/content/docs/ru/index.mdx
index 30ec4c51e..0ee08694b 100644
--- a/src/frontend/src/content/docs/ru/index.mdx
+++ b/src/frontend/src/content/docs/ru/index.mdx
@@ -11,7 +11,7 @@ prev: false
next: false
banner:
content: |
- 🚀 Aspire 13.4 выпущен! — Что нового в Aspire 13.4.
+ ✨ Aspire 13.5 выпущен! — Что нового в Aspire 13.5.
hero:
tagline: Ваш стек, упрощён. Оркестрируйте фронтенды, API, контейнеры и базы данных без усилий—без переписывания, без ограничений. Расширяйте Aspire для любого проекта.
image:
diff --git a/src/frontend/src/content/docs/tr/index.mdx b/src/frontend/src/content/docs/tr/index.mdx
index 10ec9f4a2..aca886187 100644
--- a/src/frontend/src/content/docs/tr/index.mdx
+++ b/src/frontend/src/content/docs/tr/index.mdx
@@ -11,7 +11,7 @@ prev: false
next: false
banner:
content: |
- 🚀 Aspire 13.4 yayınlandı! — Aspire 13.4'deki yeniliklere bakın.
+ ✨ Aspire 13.5 yayınlandı! — Aspire 13.5'deki yeniliklere bakın.
hero:
tagline: Yığınınız basitleştirildi. Frontend'leri, API'leri, konteynerleri ve veritabanlarını zahmetsizce orkestre edin—yeniden yazma yok, sınır yok. Her projeyi güçlendirmek için Aspire'ı genişletin.
image:
diff --git a/src/frontend/src/content/docs/uk/index.mdx b/src/frontend/src/content/docs/uk/index.mdx
index 0b277f82a..f4d0ad623 100644
--- a/src/frontend/src/content/docs/uk/index.mdx
+++ b/src/frontend/src/content/docs/uk/index.mdx
@@ -11,7 +11,7 @@ prev: false
next: false
banner:
content: |
- 🚀 Aspire 13.4 випущено! — Що нового в Aspire 13.4.
+ ✨ Aspire 13.5 випущено! — Що нового в Aspire 13.5.
hero:
tagline: Ваш стек спрощено. Оркеструйте фронтенди, API, контейнери та бази даних без зусиль—без переписування, без обмежень. Розширюйте Aspire для будь-якого проєкту.
image:
diff --git a/src/frontend/src/content/docs/whats-new/aspire-13-3.mdx b/src/frontend/src/content/docs/whats-new/aspire-13-3.mdx
index 2e0a67436..1a07dc941 100644
--- a/src/frontend/src/content/docs/whats-new/aspire-13-3.mdx
+++ b/src/frontend/src/content/docs/whats-new/aspire-13-3.mdx
@@ -521,7 +521,7 @@ await builder.build().run();
### Resource commands return structured results
-Custom resource commands can now return an `ExecuteCommandResult` with a structured `Message` payload that the dashboard renders in the notification center. The new `Logger` property on `ExecuteCommandContext` lets command implementations log directly to the resource's log stream.
+Custom resource commands can now return an `ExecuteCommandResult` with structured `Data` payloads (`Text`, `Json`, or `Markdown`) that the dashboard renders from the notification center's **View response** action. The `CommandResults.Success(string, CommandResultData)` overload makes it easy to return Markdown tables and other rich output. The new `Logger` property on `ExecuteCommandContext` lets command implementations log directly to the resource's log stream.
diff --git a/src/frontend/src/content/docs/whats-new/aspire-13-4.mdx b/src/frontend/src/content/docs/whats-new/aspire-13-4.mdx
index 7ba057e48..d2e2c9d23 100644
--- a/src/frontend/src/content/docs/whats-new/aspire-13-4.mdx
+++ b/src/frontend/src/content/docs/whats-new/aspire-13-4.mdx
@@ -398,6 +398,7 @@ Aspire 13.4 includes a set of smaller CLI improvements and fixes:
- `aspire update` now requires `--yes` in non-interactive mode, matching `aspire destroy`.
- `aspire stop --all` output includes the AppHost name and, when needed, the PID for clearer multi-instance shutdown output.
- `aspire new`, `aspire init`, `aspire run`, and `aspire update` include fixes for NuGet feed errors, output paths, generated files, disabled dashboards, detached shutdown, and AppHost package-reference cleanup.
+- `aspire run` now handles AppHost shutdown more gracefully: backchannel log, resource-state, and publishing-activity streams complete immediately when a shutdown is already in progress, and a warning is shown if log capture is interrupted rather than surfacing an unhandled error.
## 🧩 App model and AppHost
@@ -473,10 +474,11 @@ Persistent lifetimes now extend beyond containers to executables and projects. C
@@ -787,7 +789,7 @@ Re-run `aspire run` (or your code-generation step) to regenerate references, and
#### Persistent executable and project lifetimes
-Support for persistent lifetimes on executables and projects updates the underlying DCP executable model (new `persistent`, `start`, and `stop` fields). Persistent resources default to proxyless endpoints, require concrete ports for executables, don't support replicas, and aren't compatible with Aspire IDE debugging sessions.
+Support for persistent lifetimes on executables and projects updates the underlying DCP executable model (new `persistent`, `start`, and `stop` fields). Persistent executables and projects default to proxyless endpoints, require concrete ports for executables, don't support replicas, and aren't compatible with Aspire IDE debugging sessions. Persistent containers use proxied endpoints by default, matching session container behavior, so integrations that depend on endpoint allocation before startup work correctly without changes.
If you adopt `WithPersistentLifetime()`, review endpoint and port configuration. Tooling pinned to the previous DCP executable schema may need to be updated. See [Configure resource lifetimes](/app-host/resource-lifetimes/).
diff --git a/src/frontend/src/content/docs/whats-new/aspire-13-5.mdx b/src/frontend/src/content/docs/whats-new/aspire-13-5.mdx
new file mode 100644
index 000000000..39914b986
--- /dev/null
+++ b/src/frontend/src/content/docs/whats-new/aspire-13-5.mdx
@@ -0,0 +1,215 @@
+---
+title: "What's new in Aspire 13.5"
+description: "Explore Aspire 13.5: Interactive terminal sessions, polyglot IInteractionService, TypeScript AppHost stability, terminal commands with user inputs, custom health checks, distributed tracing improvements, and dashboard enhancements."
+sidebar:
+ label: Aspire 13.5
+ order: 0
+tableOfContents:
+ minHeadingLevel: 2
+ maxHeadingLevel: 2
+---
+
+import {
+ Steps,
+ Aside,
+ FileTree,
+ Icon,
+ Tabs,
+ TabItem,
+} from '@astrojs/starlight/components';
+import LearnMore from '@components/LearnMore.astro';
+import OsAwareTabs from '@components/OsAwareTabs.astro';
+
+Aspire 13.5 is here with focus on **developer experience**, **polyglot feature parity**, and **runtime stability**. This release brings **interactive terminal sessions** via `WithTerminal()`, **IInteractionService available across all polyglot AppHosts** (TypeScript, Python, Go, Java, and Rust), **user-defined arguments in resource commands** for interactive workflows, **TypeScript AppHost startup optimizations** and **stability fixes**, **custom health checks for TypeScript AppHosts**, **container file copying** in polyglot AppHosts, **promoted IInteractionService to stable**, a major **Foundry integration update** to use the CLI-based lifecycle, **distributed trace improvements** including timestamp filtering, **dashboard telemetry enhancements**, new **VS Code extension commands** including opening the Dashboard in a side panel, **Bun debugging support**, **resource command visibility** in the extension tree, **Aspire CLI available via npm**, and many more improvements and bug fixes across AppHost, CLI, Dashboard, and Extensions.
+
+We'd love to hear what you think. Drop by [ Discord](https://aka.ms/aspire-discord) to chat with the team and the community, or file feedback and issues on [ GitHub](https://github.com/microsoft/aspire/issues).
+
+This release introduces:
+
+- **Interactive terminal sessions** with `WithTerminal()` on AppHost resources enable live REPL and shell interaction through the Dashboard and CLI.
+- **Polyglot IInteractionService parity** brings prompts, message boxes, notifications, and dynamic inputs to TypeScript, Python, Go, Java, and Rust AppHosts alongside C#.
+- **User-defined resource command arguments** let Dashboard and CLI prompt for input before invoking commands like custom deploy or setup workflows.
+- **TypeScript AppHost stability improvements** fix deadlocks, optimize startup by racing connection attempts against process exit, and validate compilation before execution.
+- **Custom health checks in TypeScript AppHosts** enable resource-specific health monitoring in polyglot environments.
+- **Container file copying in TypeScript AppHosts** brings parity with C# for copying host files into containers with ownership and permission controls.
+- **IInteractionService promoted to stable** removes the ASPIREINTERACTION001 diagnostic requirement from production code.
+- **CLI available via npm** (@microsoft/aspire-cli) provides an alternative installation path alongside the default distribution.
+- **Embedded Aspire skills bundle fallback** ensures the CLI can bootstrap even when GitHub release asset acquisition is unavailable.
+- **Faster TypeScript AppHost startup** skips fixed delays and races the connection retry loop, reducing time-to-ready.
+- **Friendly error messages for health check failures** replace raw exception stacks with actionable diagnostics in the Dashboard.
+- **Distributed trace timestamp filtering** enables precise telemetry searches by date and time.
+- **VS Code Dashboard in side panel** lets you monitor your app without leaving VS Code.
+- **Bun debugging support** in VS Code extension via WebKit Inspector Protocol.
+- **Resource commands in VS Code tree view** display all available actions (Start, Stop, custom commands) under each resource.
+- **Improved parameter display** in VS Code shows secret masks, missing value warnings, and consistent formatting across panels.
+- **VS Code extension renamed to "Aspire"** and rebranded for clarity on the Marketplace.
+- **AppHost discovery efficiency** in VS Code respects exclusion settings and debounces file changes to reduce background scanning.
+- **Foundry Local integration CLI update** now uses the foundry CLI for lifecycle management, requiring foundry 1.1.0+.
+- **Proxyless endpoint port allocation** assigns dynamic public host ports before resources are created, so endpoint property references resolve consistently.
+- …and much more.
+
+## 🆙 Upgrade to Aspire 13.5
+
+
+
+
+
+
+For general purpose upgrade guidance, see [Upgrade Aspire](/whats-new/upgrade-aspire/).
+
+The easiest way to upgrade to Aspire 13.5 is using the [`aspire update` command](/reference/cli/commands/aspire-update/):
+
+
+
+1. Update the Aspire CLI itself:
+
+ ```bash title="Aspire CLI — Update the CLI"
+ aspire update --self
+ ```
+
+1. Update your projects (run from the root of your repository):
+
+ ```bash title="Aspire CLI — Update all Aspire packages"
+ aspire update
+ ```
+
+
+
+Or install the CLI from scratch:
+
+
+
+
+ ```bash title="Aspire CLI — Install Aspire CLI"
+ curl -sSL https://aspire.dev/install.sh | bash
+ ```
+
+
+
+
+ ```powershell title="Aspire CLI — Install Aspire CLI"
+ irm https://aspire.dev/install.ps1 | iex
+ ```
+
+
+
+
+
+ For more details on installing the Aspire CLI, see [Install the CLI](/get-started/install-cli/).
+
+
+## 🖥️ Interactive terminal sessions with WithTerminal()
+
+AppHost authors can now call `WithTerminal()` on a resource to enable interactive terminal sessions. The Dashboard and CLI can attach to and detach from the session at will, enabling live use of REPLs, shells, and other terminal programs running as Aspire resources. This is particularly powerful for resource orchestration workflows where you need to interact with services in real-time.
+
+
+ For details, see [WithTerminal() interactive terminal sessions](/app-host/with-terminal/).
+
+
+## 🌐 IInteractionService available across polyglot AppHosts
+
+IInteractionService and all related interaction types (prompts, message boxes, notifications, dynamic inputs) are now available in **polyglot AppHosts** written in TypeScript, Python, Go, Java, and Rust—providing feature parity with C# AppHosts. This enables rich user interaction patterns across all supported languages.
+
+
+ For TypeScript examples, see [IInteractionService](/extensibility/interaction-service/).
+
+
+## 🆙 IInteractionService promoted to stable
+
+The `IInteractionService` API is no longer marked experimental. The `ASPIREINTERACTION001` diagnostic has been removed, so you can use interaction features without compiler suppressions in production code.
+
+## ⚙️ Resource commands with user-defined arguments
+
+HTTP resource commands now support named arguments, allowing the Dashboard and CLI to prompt for user input before invoking them. TypeScript AppHosts achieve full parity through Aspire Type System (ATS) exports. This enables interactive workflows such as custom deployment or setup procedures.
+
+## 💚 Custom health checks for TypeScript AppHosts
+
+TypeScript AppHosts can now register custom health check callbacks using `builder.addHealthCheck()` and attach them to resources. Project resources also gain `withEndpointsInEnvironment()` to control which endpoints are injected into environment variables.
+
+## 🐳 TypeScript AppHosts support container file copying
+
+TypeScript AppHosts can now export `withContainerFiles` to copy host files into container resources, with full support for owner, group, and umask options—achieving parity with C# AppHosts.
+
+## ⚡ Faster TypeScript AppHost startup
+
+TypeScript AppHost startup no longer waits a fixed delay before the CLI attempts to connect. The CLI now races the RPC connection retry loop against process exit, reducing the time from `aspire run` to an active AppHost.
+
+## 🔧 TypeScript AppHost fixes
+
+- Fixed a deadlock in TypeScript AppHosts where async callbacks stored in `IOptions.Configure` were invoked during `BeforeStartEvent`.
+- Fixed a startup reliability issue with `WithBrowserLogs()` where tracked browser sessions could fail even when the browser eventually became responsive. The CDP startup command timeout has been increased.
+- Fixed failures when proxyless container endpoint references were accessed before container creation.
+- Fixed `aspire run` failing for polyglot AppHosts using `*.dev.localhost` resource service URLs.
+
+## 📦 Aspire CLI available via npm
+
+The Aspire CLI is now available as an npm package (`@microsoft/aspire-cli`), providing an alternative installation method alongside the standard distribution. The update command and update notifier now detect and handle npm-installed versions.
+
+## 💬 CLI improvements and diagnostics
+
+- **OS information in `aspire doctor`**: The `aspire doctor` command now reports operating system details in its Environment section. Human-readable output shows the OS type and version; on Linux it includes distro details from `/etc/os-release`. JSON output adds a structured `operating-system` check with `osType`, `displayName`, `version`, and `description` metadata fields for tooling.
+- **Embedded Aspire skills bundle fallback**: When GitHub release asset acquisition is unavailable, the CLI uses the embedded bundle and shows a non-fatal warning instead of failing the entire command.
+- **Faster stale backchannel socket cleanup**: Stale AppHost backchannel socket files no longer block CLI commands like `aspire add`. The CLI automatically prunes orphaned sockets before probing.
+- **Better TypeScript AppHost error messages**: When AppHost code generation fails due to version mismatches, the CLI provides enriched diagnostic output to help identify the cause.
+- **Improved aspire agent init output**: The command now collects updated skill/location pairs and prints one compact summary instead of repeating success for every skill.
+- **Improved aspire ls discovery**: Fixed multiple bugs in the settings discovery pipeline including settings.json compatibility and aspire.config.json handling.
+- **TypeScript AppHosts honor --no-build**: TypeScript AppHosts now correctly skip the TypeScript compilation check when the --no-build flag is passed.
+- **CLI shutdown responsiveness**: Multiple improvements to Ctrl+C/SIGTERM handling, including faster signal responsiveness during AppHost startup.
+
+## 📊 Dashboard and telemetry improvements
+
+- **Timestamp filter for telemetry**: Filter logs and traces by timestamp using a dedicated search qualifier in the Dashboard filter dialog.
+- **Numeric equality operators**: The telemetry filter dialog now includes `==` and `!=` operators for exact numeric value matching.
+- **Rich text visualizer improvements**: The TextVisualizerDialog now disables markdown formatting for JSON and XML content.
+- **Dashboard startup log formatting**: Improved output with indented URLs, separated container access warnings, and restored legacy login URL for `dotnet watch` integration.
+- **Friendly health check error messages**: Health check failures now display concise, actionable messages instead of raw exception stacks.
+- **Fixed telemetry streaming with resource filters**: Streams now wait for resources to appear before returning empty results.
+- **Fixed duplicate replica display names**: Dashboard now uses the last 8 characters of the service.instance.id GUID to prevent collisions.
+
+## 🧩 VS Code extension enhancements
+
+- **Open Aspire Dashboard in side panel**: A new command lets you open the Dashboard in a side-by-side panel instead of an external browser.
+- **Bun debugging support**: VS Code extension now supports debugging Bun applications via the WebKit Inspector Protocol.
+- **Resource commands in tree view**: Resource commands (Start, Stop, custom commands) are displayed as child items under each resource.
+- **VS Code extension telemetry**: The extension now collects activation, debug session, and dashboard interaction signals for product improvement.
+- **Support launchUrl in launchSettings.json**: The extension respects the `launchUrl` property as the serverReadyAction URI format.
+- **Show discovered AppHosts in Aspire pane**: Idle AppHosts discovered via `aspire ls` now display in the VS Code Aspire pane with context menu actions.
+- **Security hardening**: Terminal commands now use structured shell arguments to prevent command injection via malicious paths or resource names.
+- **Parameter display improvements**: Consistent display across panels with secret masks, missing value warnings, and 80-character truncation for non-secrets.
+- **VS Code extension branding**: Rebranded to "Aspire" with an updated icon and display name.
+- **AppHost discovery efficiency**: Respects workspace exclusion settings, debounces file changes, and avoids overlapping discovery runs.
+
+## 🔌 Integration improvements
+
+- **Foundry Local CLI update**: The Foundry Local integration now uses the installed foundry CLI for lifecycle management instead of internal SDK APIs, requiring foundry CLI 1.1.0+.
+- **DevTunnel region configuration**: Added a `Region` property to `DevTunnelOptions` for specifying the tunnel creation region.
+- **Blazor gateway Docker Compose support**: Added Docker Compose publish support for Blazor gateway resources.
+- **Redis TLS deadlock fix**: Fixed a deadlock during Redis container startup when TLS was enabled with persistent lifetime.
+
+## Breaking changes
+
+The following breaking changes are included in Aspire 13.5:
+
+1. **ServiceProvider renamed to Services**: The `ServiceProvider` property on context types is now obsolete and replaced with `Services`. The old property still works but generates a compiler warning. Update your code to use the new property name.
+
+2. **PublishAsConnectionString marked obsolete**: The `PublishAsConnectionString` extension methods are now obsolete. Callers should switch to `AddConnectionString` in publish-mode app model code.
+
+3. **aspire ps --resources flag removed**: The `--resources` and `--include-hidden` flags have been removed from `aspire ps`, which now focuses on AppHost-level summaries. Use `aspire describe` for detailed resource data.
+
+4. **GitHub Models integration deprecated**: The GitHub Models service is no longer available to new customers, so the `Aspire.Hosting.GitHub.Models` integration is sunset as of Aspire 13.5. All public APIs are marked `[Obsolete]`, and the package no longer appears in `aspire add` output. One final obsolete release will ship on NuGet, and the package will be removed entirely in a future version. Migrate to the [Azure AI Foundry integration](/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-get-started/) instead. See [microsoft/aspire#18402](https://github.com/microsoft/aspire/issues/18402) for details.
+
+5. **Proxyless endpoint port allocation timing changed**: Proxyless endpoints without an explicit public `port` now receive one during service preparation, before workload resources are created. Executable proxyless endpoints that previously failed without a public port, and container proxyless endpoints that expected the public port to be assigned later during container startup, should expect Aspire to assign the port earlier. The default allocation range is `10000-32767` and can be overridden with `ASPIRE_PROXYLESS_ENDPOINT_PORT_RANGE=start-end`. Persistent resources reuse allocated ports from user secrets when available.
+
+6. **Go polyglot SDK: single optional `options` DTO is now passed directly**: When a C# exported API has exactly one optional parameter that is a DTO named `options` (with no coexisting cancellation token or callback), the Go polyglot code generator now passes the DTO type directly as a variadic parameter instead of wrapping it in a generated method-options struct. Go AppHosts that used the wrapper-struct form must update their call sites after regenerating the SDK.
+
+
+
+## Known issues
+
+No Aspire 13.5 known issues are documented yet. If you discover an issue, please [report it on GitHub](https://github.com/microsoft/aspire/issues).
diff --git a/src/frontend/src/content/docs/zh-cn/index.mdx b/src/frontend/src/content/docs/zh-cn/index.mdx
index c5a354b1c..c2e46874f 100644
--- a/src/frontend/src/content/docs/zh-cn/index.mdx
+++ b/src/frontend/src/content/docs/zh-cn/index.mdx
@@ -11,7 +11,7 @@ prev: false
next: false
banner:
content: |
- 🚀 Aspire 13.4 已发布! — 查看 Aspire 13.4 的新功能。
+ ✨ Aspire 13.5 已发布! — 查看 Aspire 13.5 的新功能。
hero:
tagline: 精简你的技术栈。轻松编排前端、API、容器和数据库—无需重写,无限可能。扩展 Aspire 为任何项目赋能。
image:
diff --git a/src/frontend/tests/unit/aspire-version-placeholders.vitest.test.ts b/src/frontend/tests/unit/aspire-version-placeholders.vitest.test.ts
new file mode 100644
index 000000000..20ef2e16f
--- /dev/null
+++ b/src/frontend/tests/unit/aspire-version-placeholders.vitest.test.ts
@@ -0,0 +1,158 @@
+import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
+import os from 'node:os';
+import path from 'node:path';
+import { describe, expect, test } from 'vitest';
+import { replaceAspireVersionPlaceholdersInDirectory } from '../../config/aspire-version-placeholders-integration.mjs';
+import {
+ currentAspireMajorMinorVersion,
+ currentAspireVersion,
+} from '../../config/aspire-versions.mjs';
+import {
+ remarkAspireVersionPlaceholders,
+ replaceAspireVersionPlaceholders,
+} from '../../config/remark-aspire-version-placeholders.mjs';
+
+describe('Aspire version placeholders', () => {
+ test('replaces current Aspire major.minor and patch placeholders', () => {
+ expect(
+ replaceAspireVersionPlaceholders(
+ 'Aspire %ASPIRE_VERSION_MAJOR_MINOR% ships as %ASPIRE_VERSION%.'
+ )
+ ).toBe(`Aspire ${currentAspireMajorMinorVersion} ships as ${currentAspireVersion}.`);
+ });
+
+ test('replaces placeholders in markdown text, code fences, and MDX attributes', () => {
+ const tree = {
+ type: 'root',
+ children: [
+ {
+ type: 'paragraph',
+ children: [{ type: 'text', value: 'Aspire %ASPIRE_VERSION_MAJOR_MINOR%' }],
+ },
+ { type: 'code', lang: 'bash', value: 'aspire %ASPIRE_VERSION%' },
+ {
+ type: 'mdxJsxFlowElement',
+ name: 'Code',
+ attributes: [{ type: 'mdxJsxAttribute', name: 'code', value: '%ASPIRE_VERSION%' }],
+ children: [],
+ },
+ ],
+ };
+
+ remarkAspireVersionPlaceholders()(tree);
+
+ expect(tree.children[0].children[0].value).toBe(
+ `Aspire ${currentAspireMajorMinorVersion}`
+ );
+ expect(tree.children[1].value).toBe(`aspire ${currentAspireVersion}`);
+ expect(tree.children[2].attributes[0].value).toBe(currentAspireVersion);
+ });
+
+ test('replaces placeholders only in Markdown copies, leaving other assets untouched', async () => {
+ const tempDir = await mkdtemp(path.join(os.tmpdir(), 'aspire-version-placeholders-'));
+
+ try {
+ const markdownPath = path.join(tempDir, 'example.md');
+ const htmlPath = path.join(tempDir, 'example.html');
+ const textPath = path.join(tempDir, 'example.txt');
+ const mdxPath = path.join(tempDir, 'example.mdx');
+ const jsonPath = path.join(tempDir, 'example.json');
+
+ const placeholderContent = 'Aspire %ASPIRE_VERSION_MAJOR_MINOR%: %ASPIRE_VERSION%';
+
+ await Promise.all([
+ writeFile(markdownPath, placeholderContent),
+ writeFile(htmlPath, placeholderContent),
+ writeFile(textPath, placeholderContent),
+ writeFile(mdxPath, placeholderContent),
+ writeFile(jsonPath, '{"version":"%ASPIRE_VERSION%"}'),
+ ]);
+
+ await replaceAspireVersionPlaceholdersInDirectory(tempDir);
+
+ // Only the `.md` copy (which bypasses the remark pipeline) is rewritten.
+ await expect(readFile(markdownPath, 'utf8')).resolves.toBe(
+ `Aspire ${currentAspireMajorMinorVersion}: ${currentAspireVersion}`
+ );
+
+ // The post-build pass intentionally rewrites only `.md` files. In the real
+ // build `.html`/`.txt`/`.mdx` are produced through the remark pipeline (so
+ // they're already replaced before this pass runs) and `.json` is never a
+ // placeholder target; this test seeds them with raw placeholders to assert
+ // that this pass leaves every non-`.md` extension untouched.
+ await expect(readFile(htmlPath, 'utf8')).resolves.toBe(placeholderContent);
+ await expect(readFile(textPath, 'utf8')).resolves.toBe(placeholderContent);
+ await expect(readFile(mdxPath, 'utf8')).resolves.toBe(placeholderContent);
+ await expect(readFile(jsonPath, 'utf8')).resolves.toBe('{"version":"%ASPIRE_VERSION%"}');
+ } finally {
+ await rm(tempDir, { recursive: true, force: true });
+ }
+ });
+
+ test('replaces Markdown placeholders recursively under a bounded concurrency limit', async () => {
+ const tempDir = await mkdtemp(path.join(os.tmpdir(), 'aspire-version-placeholders-'));
+
+ try {
+ // Spread more `.md` files than the worker-pool concurrency across nested
+ // directories so the bounded recursive traversal is exercised, alongside
+ // non-`.md` assets that must be left untouched.
+ const placeholderContent = 'Aspire %ASPIRE_VERSION_MAJOR_MINOR% is %ASPIRE_VERSION%.';
+ const ignoredExtensions = ['.html', '.txt', '.mdx', '.json'];
+ const markdownPaths: string[] = [];
+ const ignoredPaths: string[] = [];
+
+ for (let depth = 0; depth < 4; depth++) {
+ const dir = path.join(tempDir, ...Array.from({ length: depth }, (_, i) => `level-${i}`));
+ await mkdir(dir, { recursive: true });
+
+ for (let index = 0; index < 5; index++) {
+ const markdownPath = path.join(dir, `asset-${index}.md`);
+ await writeFile(markdownPath, placeholderContent);
+ markdownPaths.push(markdownPath);
+
+ const extension = ignoredExtensions[index % ignoredExtensions.length];
+ const ignoredPath = path.join(dir, `asset-${index}${extension}`);
+ await writeFile(ignoredPath, placeholderContent);
+ ignoredPaths.push(ignoredPath);
+ }
+ }
+
+ await replaceAspireVersionPlaceholdersInDirectory(tempDir, 2);
+
+ await Promise.all(
+ markdownPaths.map(async (markdownPath) => {
+ await expect(readFile(markdownPath, 'utf8')).resolves.toBe(
+ `Aspire ${currentAspireMajorMinorVersion} is ${currentAspireVersion}.`
+ );
+ })
+ );
+
+ await Promise.all(
+ ignoredPaths.map(async (ignoredPath) => {
+ await expect(readFile(ignoredPath, 'utf8')).resolves.toBe(placeholderContent);
+ })
+ );
+ } finally {
+ await rm(tempDir, { recursive: true, force: true });
+ }
+ });
+
+ test('falls back to a valid worker count when given a non-finite concurrency', async () => {
+ const tempDir = await mkdtemp(path.join(os.tmpdir(), 'aspire-version-placeholders-'));
+
+ try {
+ const markdownPath = path.join(tempDir, 'example.md');
+ await writeFile(markdownPath, 'Aspire %ASPIRE_VERSION_MAJOR_MINOR%: %ASPIRE_VERSION%');
+
+ // A non-finite concurrency must not collapse the worker pool to an empty
+ // array and silently skip every file.
+ await replaceAspireVersionPlaceholdersInDirectory(tempDir, Number.NaN);
+
+ await expect(readFile(markdownPath, 'utf8')).resolves.toBe(
+ `Aspire ${currentAspireMajorMinorVersion}: ${currentAspireVersion}`
+ );
+ } finally {
+ await rm(tempDir, { recursive: true, force: true });
+ }
+ });
+});