From 31183e05b0cc402c3e23075b703a44c208da1d1b Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Fri, 30 Jan 2026 12:48:45 -0500 Subject: [PATCH 01/10] Clarify Azure AI Foundry format parameter documentation (#313) * Initial plan * Improve Azure AI Foundry format parameter documentation Co-authored-by: IEvangelist <7679720+IEvangelist@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: IEvangelist <7679720+IEvangelist@users.noreply.github.com> --- .../docs/integrations/cloud/azure/azure-ai-foundry.mdx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry.mdx index 1650eef0b..41dc588c6 100644 --- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry.mdx +++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry.mdx @@ -72,7 +72,12 @@ The preceding code: - Adds an Azure AI Foundry deployment resource named `chat` with a model name of `Phi-4`. The model name must correspond to an [available model](https://learn.microsoft.com/azure/ai-foundry/foundry-models/concepts/models) in the Azure AI Foundry service. > [!NOTE] -> The `format` parameter of the `AddDeployment(...)` method can be found in the Azure AI Foundry portal in the details page of the model, right after the `Quick facts` text. +> The `format` parameter of the `AddDeployment(...)` method specifies the model publisher or provider. Common values include: +> +> - `"OpenAI"` for GPT models (e.g., GPT-4o, GPT-4, GPT-3.5 Turbo) +> - `"Microsoft"` for Phi models (e.g., Phi-4, Phi-3.5) +> +> For more information, see the [AIFoundryModel API reference](https://learn.microsoft.com/dotnet/api/aspire.hosting.azure.aifoundrymodel). ### Configure deployment properties From ed14c0c407d437fed9ee34fc74d6a13b3bc57981 Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Sat, 31 Jan 2026 10:15:58 -0600 Subject: [PATCH 02/10] Configure WAF on the Azure Front Door (#324) * Configure WAF on the Azure Front Door These policies are required by Microsoft to prevent DDOS attacks on the site. * Fix invalid wafPolicy name --- .../Bicep/front-door-appservice.bicep | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/src/apphost/Aspire.Dev.AppHost/Bicep/front-door-appservice.bicep b/src/apphost/Aspire.Dev.AppHost/Bicep/front-door-appservice.bicep index e8b41defd..c1b911131 100644 --- a/src/apphost/Aspire.Dev.AppHost/Bicep/front-door-appservice.bicep +++ b/src/apphost/Aspire.Dev.AppHost/Bicep/front-door-appservice.bicep @@ -4,6 +4,9 @@ param appServiceHostName string @description('Location for all resources, needed because Aspire always injects a location parameter') param location string = resourceGroup().location +@description('Rate limit threshold value for rate limit custom rule (requests per 5 minutes)') +param rateLimitThreshold int = 500 + resource frontDoorProfile 'Microsoft.Cdn/profiles@2024-02-01' = { name: take('${frontDoorName}${uniqueString(resourceGroup().id)}', 50) location: 'Global' @@ -96,3 +99,82 @@ resource route 'Microsoft.Cdn/profiles/afdEndpoints/routes@2025-06-01' = { } output endpointUrl string = 'https://${frontDoorEndpoint.properties.hostName}' + +// WAF Policy for DDoS compliance +// Note: WAF policy names must be alphanumeric only (no hyphens) +resource wafPolicy 'Microsoft.Network/FrontDoorWebApplicationFirewallPolicies@2025-03-01' = { + name: take('${replace(frontDoorName, '-', '')}wafDDoS${uniqueString(resourceGroup().id)}', 128) + location: 'Global' + sku: { + name: 'Premium_AzureFrontDoor' + } + properties: { + policySettings: { + enabledState: 'Enabled' + mode: 'Detection' + customBlockResponseStatusCode: 403 + requestBodyCheck: 'Enabled' + javascriptChallengeExpirationInMinutes: 30 + } + customRules: { + rules: [ + { + name: 'GlobalRateLimitRule' + enabledState: 'Enabled' + priority: 100 + ruleType: 'RateLimitRule' + rateLimitDurationInMinutes: 5 + rateLimitThreshold: rateLimitThreshold + matchConditions: [ + { + matchVariable: 'RequestUri' + operator: 'Contains' + negateCondition: false + matchValue: [ + '/' + ] + transforms: [] + } + ] + action: 'Block' + } + ] + } + managedRules: { + managedRuleSets: [ + { + ruleSetType: 'Microsoft_BotManagerRuleSet' + ruleSetVersion: '1.1' + ruleGroupOverrides: [] + exclusions: [] + } + ] + } + } +} + +// Security policy to associate WAF with Front Door endpoint +resource securityPolicy 'Microsoft.Cdn/profiles/securityPolicies@2025-06-01' = { + parent: frontDoorProfile + name: take('${frontDoorName}-AppDDoS${uniqueString(resourceGroup().id)}', 260) + properties: { + parameters: { + type: 'WebApplicationFirewall' + wafPolicy: { + id: wafPolicy.id + } + associations: [ + { + domains: [ + { + id: frontDoorEndpoint.id + } + ] + patternsToMatch: [ + '/*' + ] + } + ] + } + } +} From 289a0ddd6b3208e5010f8b13df6e5f1bc83499ef Mon Sep 17 00:00:00 2001 From: Tristan Date: Mon, 2 Feb 2026 09:09:56 -0500 Subject: [PATCH 03/10] Update resource creation in Node.js docs (#333) Correction to invalid syntax. --- .../docs/dashboard/enable-browser-telemetry.mdx | 4 ++-- .../content/docs/dashboard/standalone-for-nodejs.mdx | 4 ++-- .../docs/get-started/add-aspire-existing-app.mdx | 10 ++++++++-- .../docs/ja/get-started/add-aspire-existing-app.mdx | 10 ++++++++-- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/frontend/src/content/docs/dashboard/enable-browser-telemetry.mdx b/src/frontend/src/content/docs/dashboard/enable-browser-telemetry.mdx index 88af2b4ff..ede8144ac 100644 --- a/src/frontend/src/content/docs/dashboard/enable-browser-telemetry.mdx +++ b/src/frontend/src/content/docs/dashboard/enable-browser-telemetry.mdx @@ -210,7 +210,7 @@ import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-tra import { DocumentLoadInstrumentation } from '@opentelemetry/instrumentation-document-load'; import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto'; import { registerInstrumentations } from '@opentelemetry/instrumentation'; -import { Resource } from '@opentelemetry/resources'; +import { resourceFromAttributes } from '@opentelemetry/resources'; import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; import { WebTracerProvider } from '@opentelemetry/sdk-trace-web'; import { ZoneContextManager } from '@opentelemetry/context-zone'; @@ -225,7 +225,7 @@ export function initializeTelemetry(otlpUrl, headers, resourceAttributes) { attributes[SemanticResourceAttributes.SERVICE_NAME] = 'browser'; const provider = new WebTracerProvider({ - resource: new Resource(attributes), + resource: resourceFromAttributes(attributes), }); provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter())); provider.addSpanProcessor(new SimpleSpanProcessor(new OTLPTraceExporter(otlpOptions))); diff --git a/src/frontend/src/content/docs/dashboard/standalone-for-nodejs.mdx b/src/frontend/src/content/docs/dashboard/standalone-for-nodejs.mdx index 2f0a1cba9..8a9e12c4a 100644 --- a/src/frontend/src/content/docs/dashboard/standalone-for-nodejs.mdx +++ b/src/frontend/src/content/docs/dashboard/standalone-for-nodejs.mdx @@ -115,14 +115,14 @@ Now let's add OpenTelemetry instrumentation to send telemetry data to the Aspire const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc'); const { OTLPMetricExporter } = require('@opentelemetry/exporter-metrics-otlp-grpc'); const { PeriodicExportingMetricReader } = require('@opentelemetry/sdk-metrics'); - const { Resource } = require('@opentelemetry/resources'); + const { resourceFromAttributes } = require('@opentelemetry/resources'); const { ATTR_SERVICE_NAME } = require('@opentelemetry/semantic-conventions'); // Configure the OTLP endpoint for standalone dashboard const otlpEndpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4317'; // Create resource with service name - const resource = new Resource({ + const resource = resourceFromAttributes({ [ATTR_SERVICE_NAME]: 'weather-api-nodejs', }); diff --git a/src/frontend/src/content/docs/get-started/add-aspire-existing-app.mdx b/src/frontend/src/content/docs/get-started/add-aspire-existing-app.mdx index 6721c9d6a..a4316555a 100644 --- a/src/frontend/src/content/docs/get-started/add-aspire-existing-app.mdx +++ b/src/frontend/src/content/docs/get-started/add-aspire-existing-app.mdx @@ -635,12 +635,18 @@ JavaScript/Node.js applications can also send telemetry using OpenTelemetry: const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc'); const { OTLPMetricExporter } = require('@opentelemetry/exporter-metrics-otlp-grpc'); const { PeriodicExportingMetricReader } = require('@opentelemetry/sdk-metrics'); - const { Resource } = require('@opentelemetry/resources'); + const { resourceFromAttributes } = require('@opentelemetry/resources'); + const { ATTR_SERVICE_NAME } = require('@opentelemetry/semantic-conventions'); const otlpEndpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4317'; + // Create resource with service name + const resource = resourceFromAttributes({ + [ATTR_SERVICE_NAME]: 'frontend', + }); + const sdk = new NodeSDK({ - resource: new Resource({ 'service.name': 'frontend' }), + resource: resource, traceExporter: new OTLPTraceExporter({ url: otlpEndpoint }), metricReader: new PeriodicExportingMetricReader({ exporter: new OTLPMetricExporter({ url: otlpEndpoint }) diff --git a/src/frontend/src/content/docs/ja/get-started/add-aspire-existing-app.mdx b/src/frontend/src/content/docs/ja/get-started/add-aspire-existing-app.mdx index 11758efea..e056b2db8 100644 --- a/src/frontend/src/content/docs/ja/get-started/add-aspire-existing-app.mdx +++ b/src/frontend/src/content/docs/ja/get-started/add-aspire-existing-app.mdx @@ -677,13 +677,19 @@ JavaScript / Node.js アプリケーションも、OpenTelemetry を使用して const { PeriodicExportingMetricReader, } = require('@opentelemetry/sdk-metrics'); - const { Resource } = require('@opentelemetry/resources'); + const { resourceFromAttributes } = require('@opentelemetry/resources'); + const { ATTR_SERVICE_NAME } = require('@opentelemetry/semantic-conventions'); const otlpEndpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4317'; + // Create resource with service name + const resource = resourceFromAttributes({ + [ATTR_SERVICE_NAME]: 'frontend', + }); + const sdk = new NodeSDK({ - resource: new Resource({ 'service.name': 'frontend' }), + resource: resource, traceExporter: new OTLPTraceExporter({ url: otlpEndpoint }), metricReader: new PeriodicExportingMetricReader({ exporter: new OTLPMetricExporter({ url: otlpEndpoint }), From 0beadf61a07cdb5244860d78d769ae383f2e1b1c Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Mon, 2 Feb 2026 17:22:58 +0000 Subject: [PATCH 04/10] Add generic "Upgrade Aspire" article under What's new (#322) * Initial plan * Add Upgrade Aspire article and update sidebar configuration Co-authored-by: IEvangelist <7679720+IEvangelist@users.noreply.github.com> * Fix typo and remove broken link in Upgrade Aspire article Co-authored-by: IEvangelist <7679720+IEvangelist@users.noreply.github.com> * refactor: streamline Upgrade Aspire article and remove legacy content * fix: update Upgrade Aspire article for clarity and accuracy * chore: remove outdated setup and tooling link from Upgrade Aspire article * fix: update link to installation instructions for Aspire CLI in Upgrade Aspire article * fix: clarify upgrade instructions and remove outdated content in Upgrade Aspire article --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: IEvangelist <7679720+IEvangelist@users.noreply.github.com> Co-authored-by: David Pine --- src/frontend/config/sidebar/docs.topics.ts | 24 +++++- .../content/docs/whats-new/upgrade-aspire.mdx | 86 +++++++++++++++++++ 2 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 src/frontend/src/content/docs/whats-new/upgrade-aspire.mdx diff --git a/src/frontend/config/sidebar/docs.topics.ts b/src/frontend/config/sidebar/docs.topics.ts index dbbf52c7c..167d4c21e 100644 --- a/src/frontend/config/sidebar/docs.topics.ts +++ b/src/frontend/config/sidebar/docs.topics.ts @@ -74,7 +74,7 @@ export const docsTopics: StarlightSidebarTopicsUserConfig = { 'pt-PT': 'Versões anteriores', ru: 'Предыдущие версии', tr: 'Önceki sürümler', - uk: 'Попередні версії', + uk: 'Попeredні версії', 'zh-CN': '以前的版本', }, items: [ @@ -104,6 +104,28 @@ export const docsTopics: StarlightSidebarTopicsUserConfig = { }, ], }, + { + label: 'Upgrade Aspire', + slug: 'whats-new/upgrade-aspire', + translations: { + da: 'Opgrader Aspire', + de: 'Aspire aktualisieren', + en: 'Upgrade Aspire', + es: 'Actualizar Aspire', + fr: 'Mettre à jour Aspire', + hi: 'Aspire अपग्रेड करें', + id: 'Tingkatkan Aspire', + it: 'Aggiorna Aspire', + ja: 'Aspire をアップグレード', + ko: 'Aspire 업그레이드', + 'pt-BR': 'Atualizar Aspire', + 'pt-PT': 'Atualizar Aspire', + ru: 'Обновить Aspire', + tr: "Aspire'ı Yükselt", + uk: 'Оновити Aspire', + 'zh-CN': '升级 Aspire', + }, + }, ], translations: { da: 'Hvad er nyt', diff --git a/src/frontend/src/content/docs/whats-new/upgrade-aspire.mdx b/src/frontend/src/content/docs/whats-new/upgrade-aspire.mdx new file mode 100644 index 000000000..595402b0b --- /dev/null +++ b/src/frontend/src/content/docs/whats-new/upgrade-aspire.mdx @@ -0,0 +1,86 @@ +--- +title: Upgrade Aspire +description: Learn how to upgrade your Aspire projects to the latest version. +--- + +import { Aside, Steps } from '@astrojs/starlight/components'; +import { Kbd } from 'starlight-kbd/components'; +import LearnMore from '@components/LearnMore.astro'; + +Upgrading Aspire involves updating the **Aspire CLI** itself, the **Aspire SDK**, and all related **packages** in your solution. The `aspire update` command handles most of this for you, but you may also need to review breaking changes and update tooling extensions. + + + +## Upgrade with the Aspire CLI + + + +1. **Update the Aspire CLI** to the latest version: + + ```bash title="Update the Aspire CLI" + aspire update --self + ``` + +2. **Update your Aspire solution** by running: + + ```bash title="Update your Aspire solution" + aspire update + ``` + + This command automatically: + + - Updates the [`Aspire.AppHost.Sdk` version](/get-started/aspire-sdk/) + - Updates all Aspire NuGet packages to the latest version + - Supports both regular projects and Central Package Management (CPM) + + + + +For more information, see [`aspire update` command reference](/reference/cli/commands/aspire-update/). + + +## Update the VS Code extension (optional) + +If you have the Aspire extension installed, you can update it to get the latest tooling support: + + + +1. Open VS Code +2. Go to **Extensions** () +3. Search for **Aspire** +4. Click **Update** if an update is available + + + + +For more information, see [Aspire extension for VS Code](/get-started/aspire-vscode-extension/). + + +## Remove the legacy workload (Aspire 8 only) + +Still rocking the Aspire workload? No judgment here—we've all been there. 🕰️ Time to let it go and join us in the future! + + + +Please remove the **aspire workload** with the following command: + +```bash +dotnet workload uninstall aspire +``` + +## Verify the upgrade + +After upgrading, run your application to ensure everything works as expected: + +```bash title="Run the Aspire application" +aspire run +``` + +## Need help? + +- 🆘 Stuck? [Join the Discord community](https://discord.com/invite/raNPcaaSj8) for real-time support +- 🐛 Found a bug? [File a GitHub issue](https://github.com/dotnet/aspire/issues/new/choose) From 1046c9b0bf2e479da512dee64508307e9b5f11f0 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Tue, 3 Feb 2026 09:07:56 +0800 Subject: [PATCH 05/10] Add CLI telemetry details page --- .../config/sidebar/reference.topics.ts | 23 ++++++++++ .../cli/microsoft-collected-cli-telemetry.mdx | 45 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 src/frontend/src/content/docs/reference/cli/microsoft-collected-cli-telemetry.mdx diff --git a/src/frontend/config/sidebar/reference.topics.ts b/src/frontend/config/sidebar/reference.topics.ts index 3354c8764..35b393ed5 100644 --- a/src/frontend/config/sidebar/reference.topics.ts +++ b/src/frontend/config/sidebar/reference.topics.ts @@ -186,6 +186,29 @@ export const referenceTopics: StarlightSidebarTopicsUserConfig = { }, slug: 'reference/cli/configuration', }, + { + label: 'Microsoft telemetry', + translations: { + da: 'Microsoft telemetri', + de: 'Microsoft-Telemetrie', + en: 'Microsoft telemetry', + es: 'Telemetría de Microsoft', + fr: 'Télémétrie Microsoft', + hi: 'Microsoft टेलीमेट्री', + id: 'Telemetri Microsoft', + it: 'Telemetria Microsoft', + ja: 'Microsoft テレメトリ', + ko: 'Microsoft 원격 분석', + pt: 'Telemetria da Microsoft', + 'pt-BR': 'Telemetria da Microsoft', + 'pt-PT': 'Telemetria da Microsoft', + ru: 'Телеметрия Microsoft', + tr: 'Microsoft telemetrisi', + uk: 'Телеметрія Microsoft', + 'zh-CN': 'Microsoft 遥测', + }, + slug: 'reference/cli/microsoft-collected-cli-telemetry', + }, { label: 'Commands', translations: { 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 new file mode 100644 index 000000000..7af2bfb63 --- /dev/null +++ b/src/frontend/src/content/docs/reference/cli/microsoft-collected-cli-telemetry.mdx @@ -0,0 +1,45 @@ +--- +title: Microsoft-collected CLI telemetry +description: Learn about what telemetry the Aspire CLI collects and how to opt out. +--- + +import OsAwareTabs from '@components/OsAwareTabs.astro'; + +The Aspire CLI collects usage telemetry to help Microsoft improve the product. This data helps the Aspire team understand how the CLI is used and identify areas for improvement. + +## Scope + +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. + +## 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: + + +
+ +```bash +export ASPIRE_CLI_TELEMETRY_OPTOUT=true +``` + +## Disclosure + +The first time you run an Aspire CLI command, you'll see a disclosure message informing you that telemetry is being collected and how to opt out. + +## Data points + +Aspire CLI telemetry doesn't collect personal data, such as usernames or email addresses. It doesn't scan your code and doesn't extract source code, paths containing usernames, or environment-specific information. The data is sent securely to Microsoft. + +Protecting your privacy is important to Microsoft. If you suspect that telemetry is collecting sensitive data or the data is being insecurely or inappropriately handled, file an issue in the [GitHub dotnet/aspire](https://github.com/dotnet/aspire) repository for investigation. + +Aspire CLI collects the following data: + +| Aspire dashboard versions | Data | Notes | +|---------------------------|------|-------| +| 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. | — | + +## See also + +- [Aspire CLI overview](/reference/cli/overview/) From fbc08908151c2b72eddb905f93e5b1496136c017 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Tue, 3 Feb 2026 09:52:19 +0800 Subject: [PATCH 06/10] Fix --- .../docs/reference/cli/microsoft-collected-cli-telemetry.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7af2bfb63..36845fe3c 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 @@ -34,7 +34,7 @@ Protecting your privacy is important to Microsoft. If you suspect that telemetry Aspire CLI collects the following data: -| Aspire dashboard versions | Data | Notes | +| Aspire CLI versions | Data | Notes | |---------------------------|------|-------| | 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. | From 4c5df5438d1edaa4725586a0b5f29b4809324c6a Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Tue, 3 Feb 2026 09:53:15 +0800 Subject: [PATCH 07/10] Fix --- .../cli/microsoft-collected-cli-telemetry.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 36845fe3c..d90d7f6ea 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 @@ -22,6 +22,16 @@ To opt-out of telemetry collection, set the `ASPIRE_CLI_TELEMETRY_OPTOUT` enviro export ASPIRE_CLI_TELEMETRY_OPTOUT=true ``` +
+
+ +```powershell +$env:ASPIRE_CLI_TELEMETRY_OPTOUT= "true" +``` + +
+
+ ## Disclosure The first time you run an Aspire CLI command, you'll see a disclosure message informing you that telemetry is being collected and how to opt out. From 251a3e3d58a7bee7e7c3e19e693ccf70b2dce31c Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Tue, 3 Feb 2026 09:53:42 +0800 Subject: [PATCH 08/10] Fix --- .../docs/reference/cli/microsoft-collected-cli-telemetry.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d90d7f6ea..b2b0a4d82 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 @@ -45,7 +45,7 @@ Protecting your privacy is important to Microsoft. If you suspect that telemetry Aspire CLI collects the following data: | Aspire CLI versions | Data | Notes | -|---------------------------|------|-------| +|---------------------|------|-------| | 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. | — | From d37a0b2c9b31bca585756e4ffd4af126db38424f Mon Sep 17 00:00:00 2001 From: Mitch Denny Date: Tue, 3 Feb 2026 13:06:45 +1100 Subject: [PATCH 09/10] Improve doc-tester and doc-writer skills, fix cross-platform paths (#361) * Add doc-writer and doc-tester skills with hex1b MCP server - Add doc-writer skill with Aspire documentation guidelines - Add doc-tester skill for validating documentation accuracy - Include common documentation rules from PR feedback patterns - Configure hex1b MCP server in .mcp.json, .vscode/mcp.json, opencode.jsonc - Add .doc-tester-workspace/ to .gitignore - Add .vscode/mcp.json exception to .gitignore * Improve doc-tester and doc-writer skills, fix cross-platform paths Key changes: doc-tester skill: - Add Knowledge Source Awareness section to distinguish between intrinsic knowledge and documentation-derived knowledge - Add Documentation Takes Priority guidance - follow the docs being tested, not skill defaults - Add Aspire CLI installation guidance (GA, Dev, PR, and Staging builds) - Replace dotnet-specific commands with polyglot-friendly Aspire CLI (aspire add, aspire run) - Add Hex1b MCP tools section for terminal screenshots and asciinema recordings doc-writer skill: - Add AsciinemaPlayer component documentation for terminal recordings - Add Hex1b MCP tools guidance for creating new recordings - Add Aspire CLI installation guidance for testing documentation - Add aspire add recommendation for testing integration packages Other fixes: - Update Prettier extension recommendation to esbenp.prettier-vscode - Fix cross-platform path in frontend.esproj (backslash to forward slash) * Update Hex1b.McpServer to 0.66.0 --------- Co-authored-by: Mitch Denny --- .github/skills/doc-tester/SKILL.md | 807 ++++++++++++++++++ .github/skills/doc-writer/SKILL.md | 790 +++++++++++++++++ .gitignore | 10 +- .mcp.json | 7 + .vscode/extensions.json | 2 +- .vscode/mcp.json | 28 + opencode.jsonc | 9 + src/frontend/frontend.esproj | 2 +- .../src/data/aspire-integration-names.json | 141 +++ 9 files changed, 1793 insertions(+), 3 deletions(-) create mode 100644 .github/skills/doc-tester/SKILL.md create mode 100644 .github/skills/doc-writer/SKILL.md create mode 100644 .vscode/mcp.json create mode 100644 src/frontend/src/data/aspire-integration-names.json diff --git a/.github/skills/doc-tester/SKILL.md b/.github/skills/doc-tester/SKILL.md new file mode 100644 index 000000000..aacfead29 --- /dev/null +++ b/.github/skills/doc-tester/SKILL.md @@ -0,0 +1,807 @@ +--- +name: doc-tester +description: Agent for validating Aspire documentation against actual behavior. Use when auditing documentation accuracy, testing examples, or identifying discrepancies between documentation and implementation. +--- + +# Documentation Tester Skill + +This skill provides guidelines for AI agents to systematically validate the aspire.dev documentation site against the actual behavior of Aspire. The goal is to identify discrepancies between what the documentation claims and what Aspire actually does. + +## ⚠️ CRITICAL: User-Centric Testing Approach + +**You are testing the documentation as if you were a new user learning Aspire.** + +### Core Principles + +1. **Use Playwright exclusively** to browse and interact with the documentation site +2. **Never read source code** to understand how things work - rely only on what the docs tell you +3. **Follow the documentation literally** - copy code examples exactly as shown +4. **Evaluate teaching effectiveness** - can you learn from this documentation? + +### What This Means + +❌ **DO NOT:** +- Read Aspire source code to understand behavior +- Check implementation details in the dotnet/aspire repository +- Look at test files to understand expected behavior +- Use internal knowledge of the codebase +- Silently fill gaps with your built-in knowledge - flag them instead + +✅ **DO:** +- Use Playwright MCP tools to navigate the documentation site +- Read documentation content as displayed in the browser +- Copy code examples and run them in test projects +- Evaluate if explanations make sense without prior knowledge +- Flag when you use intrinsic knowledge to fill documentation gaps + +### When You Get Stuck + +If documentation is insufficient to proceed: + +1. **Document the blocker** - What were you trying to do? What information was missing? +2. **Describe the gap** - What would a user need to know to succeed? +3. **Hand off to doc-writer** - Create a task for the doc-writer skill to fix it +4. **Move on** - Continue testing other areas + +This is valuable feedback! Gaps in documentation are exactly what we're trying to find. + +### Knowledge Source Awareness + +**Be critical of the documentation by distinguishing between what you know and where that knowledge came from.** + +As an AI agent, you have built-in knowledge about programming concepts, frameworks, and common patterns. When testing documentation, constantly ask yourself: + +#### Documentation Takes Priority + +The aspire.dev documentation covers the full spectrum of the Aspire experience - from installation and project creation to advanced scenarios. **When the documentation you're testing provides instructions for a task, follow those instructions exactly, even if this skill provides different guidance.** + +For example: +- If testing a "Getting Started" page that shows how to create a project, use the commands in that documentation - not the project creation steps in this skill +- If an integration doc specifies how to add packages, follow those steps rather than the general guidance here +- The skill's instructions are defaults; the documentation being tested overrides them + +This ensures you're actually testing whether the documentation works, not whether this skill's instructions work. + +#### Questions to Ask + +1. **"Did I learn this from the documentation, or did I already know it?"** + - If you already knew it, would a new user know it too? + - Is it reasonable to assume this knowledge, or should the docs explain it? + +2. **"Am I filling in gaps with my own knowledge?"** + - If you had to use prior knowledge to complete a step, the documentation may be incomplete + - Document these gaps even if you were able to proceed + +3. **"Would this make sense to someone unfamiliar with [concept]?"** + - Aspire users come from diverse backgrounds (different languages, experience levels) + - Don't assume familiarity with .NET, containers, cloud concepts, etc. + +#### Examples + +| Situation | Question to Ask | Documentation Gap? | +|-----------|-----------------|-------------------| +| You know what a connection string is | Would a Python developer know this? | Maybe - consider if it needs explanation | +| You understand dependency injection | Does the doc explain DI or assume it? | If assumed, should link to prerequisites | +| You know `aspire run` starts all resources | Did the doc say this, or did you just know? | If not stated, it should be | +| You recognize a Redis configuration pattern | Is this explained or assumed knowledge? | New users may not recognize it | + +#### Reporting Knowledge Gaps + +When you identify that you used intrinsic knowledge to proceed, flag it in your report: + +```markdown +### Knowledge Gap: [Topic] + +**What I needed to know:** [Description] +**Source of my knowledge:** Built-in/prior knowledge (NOT from documentation) +**User impact:** [Who might struggle without this knowledge?] +**Recommendation:** +- [ ] Add explanation to this page +- [ ] Link to prerequisite documentation +- [ ] Reasonable to assume (explain why) +``` + +## Testing Goals + +### 1. Teaching Effectiveness + +Can someone learn Aspire from these docs alone? + +- Are concepts introduced in a logical order? +- Are prerequisites clearly stated? +- Do examples build on each other progressively? +- Is terminology explained before being used? +- Are common mistakes or gotchas addressed? + +### 2. Accuracy & Correctness + +Does the documentation match reality? + +- Do code examples compile and run? +- Are API signatures and parameters correct? +- Do claimed features actually exist? +- Are limitations and caveats documented? + +## Environment Setup + +### Installing the Aspire CLI + +Before testing, ensure you have the appropriate version of the Aspire CLI installed. The version needed depends on what you're testing: + +#### GA/Stable Builds (Default) + +For testing documentation of released features, use the stable release: + +```bash +# Linux/macOS +curl -sSL https://aspire.dev/install.sh | bash + +# Windows (PowerShell) +irm https://aspire.dev/install.ps1 | iex +``` + +For complete installation instructions, see the [Install Aspire CLI](/get-started/install-cli/) page on the documentation site. + +#### Nightly/Dev Builds + +For testing documentation of features being developed on the main branch, use the dev channel: + +```bash +# Linux/macOS +curl -sSL https://aspire.dev/install.sh | bash -s -- --quality dev + +# Windows (PowerShell) +iex "& { $(irm https://aspire.dev/install.ps1) } -Quality 'dev'" +``` + +You can also find the dev channel option by clicking the download icon on the aspire.dev site and selecting "Dev" from the Channel dropdown. + + + +#### PR Builds + +For testing documentation of features in specific pull requests (before they're merged), you need to install the CLI from the PR artifacts: + +1. Navigate to the PR in the [dotnet/aspire](https://github.com/dotnet/aspire) repository +2. Find the "Checks" or "Actions" section of the PR +3. Look for the build artifacts that contain the CLI +4. Download and install the CLI from the PR-specific build artifacts + +PR builds are useful when writing documentation ahead of feature merges. + +#### Staging Builds + +For testing prerelease builds from the current release branch: + +```bash +# Linux/macOS +curl -sSL https://aspire.dev/install.sh | bash -s -- --quality staging + +# Windows (PowerShell) +iex "& { $(irm https://aspire.dev/install.ps1) } -Quality 'staging'" +``` + +### Aspire App Model + +The aspire.dev workspace uses Aspire to orchestrate local services. The app model in `apphost.cs` defines the documentation site resources. Use `mcp_aspire_list_resources` to get the current resource states and URLs. + +### Starting the Local Environment + +⚠️ **CRITICAL: Terminal Isolation** + +Aspire must run in an **isolated background process** to avoid interference with other terminal commands. + +**Start Aspire:** + +```bash +cd /path/to/aspire.dev +aspire run +``` + +Use the Aspire MCP tools to get the content URL: + +``` +# Call the MCP tool +mcp_aspire_list_resources + +# Look for the frontend resource endpoint_urls +# Example output: http://frontend.dev.localhost:5000 +``` + +**IMPORTANT**: Use the local frontend URL for all testing, not https://aspire.dev + +### Creating Test Projects + +To test code examples accurately, create test projects using the Aspire CLI. + +```bash +# Create a test directory in the workspace +mkdir -p .doc-tester-workspace +cd .doc-tester-workspace + +# Create a new Aspire project using templates +aspire new aspire-starter -n DocTest -o DocTest +cd DocTest +``` + +Use `aspire new --list` to see all available project templates. Choose a template that matches the documentation you're testing (e.g., Python, JavaScript, or .NET projects). + +## Purpose + +The doc-tester agent produces actionable feedback that can: +1. Trigger the **doc-writer** skill to correct documentation inaccuracies +2. Identify product design issues that need to be addressed in Aspire +3. Surface missing documentation for existing features +4. Find broken examples or outdated instructions + +## Scope + +### What to Test + +| Area | Description | +|------|-------------| +| **Conceptual accuracy** | Do explanations match actual Aspire behavior? | +| **Code examples** | Do code samples compile and run as described? | +| **CLI commands** | Do Aspire CLI commands work as documented? | +| **Integration docs** | Are integration configurations accurate? | +| **Navigation & links** | Do internal links work? Are pages accessible? | +| **Feature coverage** | Are all significant features documented? | + +### Documentation Structure + +The documentation site includes: + +``` +/ # Landing page +/get-started/ # Getting started guides + prerequisites + install-cli + first-app + app-host + deploy-first-app + ... +/fundamentals/ # Core concepts + app-host + networking-overview + service-defaults + ... +/integrations/ # Per-integration documentation + databases/ + caching/ + messaging/ + ai/ + ... +/deployment/ # Deployment guides +/diagnostics/ # Diagnostics and telemetry +/dashboard/ # Dashboard documentation +/testing/ # Testing guides +/reference/ # API and CLI reference +/whats-new/ # Release notes +``` + +## Testing Workflow + +**All testing uses Playwright MCP tools to interact with the documentation site.** + +### Phase 0: Environment Preparation + +1. **Start Aspire**: Run `aspire run` from the repository root +2. **Get frontend URL**: Use `mcp_aspire_list_resources` to find the `frontend` endpoint +3. **Note the URL**: The script outputs the local development URL + +### Phase 1: Navigate and Read Documentation (Playwright) + +Use Playwright MCP tools to browse the documentation: + +``` +# Take an accessibility snapshot to read page content +mcp_playwright_browser_snapshot + +# Navigate to a page +mcp_playwright_browser_click with element="Getting Started link" + +# Read page content +mcp_playwright_browser_snapshot +``` + +For each documentation page: + +1. **Navigate to the page** using Playwright click actions +2. **Take a snapshot** to read the page content +3. **Evaluate the content** - Is it clear? Complete? Accurate? +4. **Note any confusion** - What would a new user struggle with? + +### Phase 2: Test CLI Commands + +For CLI commands shown in the documentation: + +1. **Copy the command exactly** as shown in the browser +2. **Run the command** in the terminal +3. **Verify output** - Does it match what the docs describe? +4. **Test variations** - Do optional parameters work as documented? + +#### Example: Testing aspire new + +```bash +# Create a test directory +cd /path/to/aspire.dev/.doc-tester-workspace +mkdir -p cli-tests && cd cli-tests + +# Test the command from documentation +aspire new aspire-starter -n TestApp -o TestApp + +# Verify the output matches documentation claims +ls TestApp/ +``` + +### Phase 3: Test Code Examples + +For each code example shown in the documentation: + +1. **Copy the code exactly** as shown in the browser +2. **Create a test project** in the workspace directory +3. **Build the code** - does it compile without errors? +4. **Run and observe** - does it behave as documented? + +#### Step 1: Create Test Project + +```bash +# Navigate to workspace +cd /path/to/aspire.dev/.doc-tester-workspace + +# Create a project using an appropriate Aspire template +aspire new aspire-starter -n ExampleTest -o ExampleTest +cd ExampleTest +``` + +Use `aspire new --list` to view available templates. Choose a template that matches the language or framework in the documentation you're testing. + +#### Step 2: Add Required Packages + +Based on the documentation being tested, use the Aspire CLI to add integration packages: + +```bash +# Add hosting packages using Aspire CLI (preferred) +aspire add Aspire.Hosting.Redis + +# Or add client packages +aspire add Aspire.StackExchange.Redis +``` + + + +#### Step 3: Apply Code Examples + +Copy the code examples from the documentation into your test project exactly as shown. This may involve: +- Updating source files (e.g., `Program.cs`, `app.py`, `server.js`) +- Adding configuration files +- Any other steps the documentation specifies + + + +#### Step 4: Run and Verify + +Use `aspire run` to build and run the application: + +```bash +aspire run +``` + +Aspire handles building and orchestrating all resources. If the documentation specifies additional build or run commands for specific languages, follow those instructions and verify they work as documented. + +### Phase 4: Test Integration Documentation + +For integration documentation: + +1. **Verify package installation** - Does the documented package exist? +2. **Test basic usage** - Does the minimal example work? +3. **Test configuration** - Do configuration options work as described? +4. **Check health checks** - Do documented health checks function? + +```bash +# Verify package exists using Aspire CLI +aspire add Aspire.Hosting.Technology + +# If package not found, document as error +``` + +### Phase 5: Evaluate Teaching Effectiveness + +As you navigate, evaluate: + +1. **Concept flow** - Are ideas introduced in a logical order? +2. **Prerequisites** - Is prior knowledge clearly stated? +3. **Completeness** - Can you accomplish tasks with just the docs? +4. **Clarity** - Would a new user understand this? + +**When you get stuck:** +- Document what you were trying to do +- Note what information was missing +- This becomes a doc-writer task + +## Focus Area Templates + +When given a focus area, use these templates to guide testing: + +### Getting Started Focus + +```markdown +## Focus: Getting Started Guide + +### Page: /get-started/[page-name] + +#### Navigation (Playwright) +- [ ] Page loads successfully +- [ ] All sections visible in snapshot +- [ ] Code examples readable +- [ ] Links to related pages work + +#### CLI Command Testing +- [ ] `aspire new` commands work as shown +- [ ] Template names are correct +- [ ] Output matches documentation + +#### Content Clarity +- [ ] Prerequisites are clearly stated +- [ ] Steps are in logical order +- [ ] New users can follow without prior knowledge + +#### Code Example Testing +- [ ] Example 1: Compiles and runs as described +- [ ] Example 2: Compiles and runs as described +``` + +### Integration Documentation Focus + +```markdown +## Focus: [Integration Name] Integration + +### Page: /integrations/[category]/[integration] + +#### Package Verification +- [ ] Hosting package exists on NuGet +- [ ] Client package exists on NuGet (if applicable) +- [ ] Package names match documentation + +#### Hosting Integration +- [ ] Basic example compiles +- [ ] Resource is created correctly +- [ ] Configuration options work +- [ ] Health checks function (if documented) + +#### Client Integration (if applicable) +- [ ] Client registration works +- [ ] Keyed services work +- [ ] Configuration providers work +- [ ] Connection strings work + +#### Cross-References +- [ ] Links to official docs work +- [ ] Links to related Aspire docs work +- [ ] See also section is complete +``` + +### Fundamentals Focus + +```markdown +## Focus: [Concept Name] + +### Page: /fundamentals/[concept] + +#### Conceptual Accuracy +- [ ] Explanations match actual behavior +- [ ] Diagrams are accurate +- [ ] Terminology is consistent + +#### Code Examples +- [ ] All examples compile +- [ ] All examples run as described +- [ ] Edge cases are addressed + +#### Completeness +- [ ] All major features covered +- [ ] Common use cases addressed +- [ ] Gotchas and limitations noted +``` + +## Output Format + +After testing a focus area, produce a structured report: + +```markdown +# Documentation Test Report + +**Focus Area:** [Description] +**Date:** [ISO Date] +**Tester:** doc-tester agent + +## Summary + +| Category | Passed | Failed | Warnings | +|----------|--------|--------|----------| +| Content Accuracy | X | Y | Z | +| Code Examples | X | Y | Z | +| CLI Commands | X | Y | Z | +| Links | X | Y | Z | + +## Critical Issues + +Issues that make documentation misleading or incorrect. + +### Issue 1: [Brief Title] + +**Location:** [Page URL and section] +**Type:** [Content/Example/CLI/Link] +**Severity:** Critical + +**What the documentation says:** +> [Quote from documentation] + +**What actually happens:** +> [Description of actual behavior] + +**Evidence:** +[Code snippet, error message, or screenshot description] + +**Recommended Action:** +- [ ] Update documentation to match behavior +- [ ] Fix implementation to match documentation +- [ ] Add clarifying note + +--- + +## Warnings + +Issues that may confuse readers but aren't strictly incorrect. + +### Warning 1: [Brief Title] + +**Location:** [Page URL and section] +**Issue:** [Description] +**Suggestion:** [How to improve] + +--- + +## Passed Checks + +[List of items that passed validation - brief summary] + +## Recommendations + +1. **Priority fixes:** [List critical issues to address first] +2. **Documentation gaps:** [Missing documentation to add] +3. **Product issues:** [Implementation bugs discovered] +``` + +## Test Workspace Management + +### Workspace Location + +Use `.doc-tester-workspace/` in the repository root for all test projects. This directory is gitignored. + +```bash +# Standard workspace structure +.doc-tester-workspace/ +├── cli-tests/ # CLI command testing +├── integration-tests/ # Integration testing +├── example-tests/ # Code example testing +└── screenshots/ # Captured screenshots +``` + +### Cleanup + +After testing, clean up test projects: + +```bash +# Remove test workspace contents +rm -rf .doc-tester-workspace/* +``` + +Keep the workspace directory but remove contents to avoid cluttering the repository. + +## Common Testing Scenarios + +### Testing a New Integration Doc + +1. Navigate to the integration page with Playwright +2. Verify package names are correct +3. Create a test AppHost project +4. Add the hosting package using `aspire add ` +5. Copy the basic usage example +6. Build and run with `aspire run` +7. Verify the resource appears in the dashboard +8. If client integration exists, add using `aspire add` and test client registration + +### Testing CLI Documentation + +1. Navigate to the CLI reference page +2. Copy each command example +3. Run in a fresh directory +4. Verify output matches documentation +5. Test documented options and flags + +### Testing Getting Started Guide + +1. Start from a completely fresh environment (new directory) +2. Follow every step exactly as written +3. Do not use prior knowledge to fill gaps +4. Document any place where you got stuck +5. Verify final result matches what's promised + +## Using MCP Tools + +### Aspire MCP Tools + +Use for checking resource status: + +``` +mcp_aspire_list_resources # Get all resources and URLs +mcp_aspire_list_console_logs # Check resource logs +mcp_aspire_list_structured_logs # Check structured logs +``` + +### Playwright MCP Tools + +Use for navigating and reading documentation: + +``` +mcp_playwright_browser_navigate # Go to a URL +mcp_playwright_browser_snapshot # Read page content +mcp_playwright_browser_click # Click elements +mcp_playwright_browser_type # Type text +mcp_playwright_browser_screenshot # Capture screenshot +``` + +### Hex1b Terminal MCP Tools + +The Hex1b MCP server provides tools for interacting with terminal sessions and capturing terminal output. This is particularly useful for: + +- **Capturing terminal screenshots** for documentation evidence +- **Recording asciinema sessions** (`.cast` files) for documentation + +#### Available Tools + +First, activate the terminal tools you need: + +``` +activate_terminal_session_creation_tools # Start bash/powershell sessions +activate_terminal_interaction_tools # Screenshots, text capture, input +``` + +Then use the terminal tools: + +``` +mcp_hex1b_list_terminals # List active terminal sessions +mcp_hex1b_start_bash_terminal # Start a new bash session +mcp_hex1b_start_pwsh_terminal # Start a new PowerShell session +mcp_hex1b_send_terminal_input # Send commands to terminal +mcp_hex1b_wait_for_terminal_text # Wait for specific output +mcp_hex1b_capture_terminal_screenshot # Capture terminal as SVG +mcp_hex1b_capture_terminal_text # Capture terminal text content +mcp_hex1b_record_asciinema # Record terminal session as .cast file +``` + +#### Asciinema Recordings + +The aspire.dev documentation uses asciinema recordings (`.cast` files) to show terminal interactions. These provide a better user experience than static screenshots. + +**Existing recordings location**: `src/frontend/public/casts/` + +**Examples of existing recordings**: +- `aspire-version.cast` - Shows `aspire --version` command +- `aspire-new.cast` - Shows project creation +- `aspire-run.cast` - Shows running an Aspire app +- `mcp-init.cast` - Shows MCP initialization + +When testing CLI documentation, consider whether an asciinema recording would better demonstrate the command output than a static code block. + +## Reporting Guidelines + +### Issue Severity Levels + +| Severity | Description | Examples | +|----------|-------------|----------| +| **Critical** | Documentation is wrong/misleading | Incorrect API signature, broken example | +| **High** | Major functionality undocumented | Missing required configuration step | +| **Medium** | Minor inaccuracy or unclear | Typo in package name, unclear explanation | +| **Low** | Enhancement suggestion | Could add more examples, better formatting | + +### Evidence Requirements + +For each issue, provide: + +1. **Exact quote** from documentation +2. **Steps to reproduce** the discrepancy +3. **Actual result** observed +4. **Expected result** based on documentation +5. **Screenshot or error message** when applicable + +### Hand-off to doc-writer + +When creating a task for doc-writer, include: + +```markdown +## Documentation Fix Required + +**Page:** /path/to/page +**Section:** Section heading + +**Current Content:** +> [Quoted text from docs] + +**Problem:** +[Description of what's wrong] + +**Suggested Fix:** +[What the documentation should say] + +**Verification:** +[How to verify the fix is correct] +``` + +## Common Issues Checklist + +Based on patterns from PR feedback, actively look for these common documentation issues: + +### Writing Quality Issues + +| Issue | What to Check | +|-------|---------------| +| **Grammatical errors** | "Now, that you have..." should be "Now that you have..." | +| **Spelling errors** | Watch for typos like "volumme", "dependenceies", "follwing" | +| **Unused imports** | Components imported but never used in the document | +| **Casual language** | Informal phrases like "treat yourself to a coffee" | +| **Duplicate content** | Similar Asides or explanations appearing multiple times | + +### Link Verification + +| Issue | What to Check | +|-------|---------------| +| **Broken internal links** | Links pointing to non-existent pages | +| **Outdated paths** | `/get-started/setup-and-tooling/` should be `/get-started/prerequisites/` | +| **Anchor links** | Links to `#section-name` where the section doesn't exist | +| **Missing redirects** | Old page paths that should redirect to new locations | + +### Code Example Issues + +| Issue | What to Check | +|-------|---------------| +| **Syntax errors** | `main.app` instead of `main:app` for Python uvicorn | +| **Duplicate language identifiers** | `csharp csharp` instead of just `csharp` | +| **Undefined variables** | Variables used in code but not defined earlier | +| **Wrong indentation style** | Aligned indentation instead of standard 4-space | +| **Incorrect technical descriptions** | Calling `process.env` a "method" (it's an object) | +| **Deprecated APIs** | Using deprecated APIs as primary examples | +| **Insecure defaults** | `TrustServerCertificate=true` without dev-only warnings | + +### Component Issues + +| Issue | What to Check | +|-------|---------------| +| **Mismatched Pivot/PivotSelector** | Pivot components missing correct `key` attribute | +| **Card text overflow** | LinkCard descriptions too long for the UI | +| **Incorrect health check links** | Links pointing to wrong technology's health check | + +### Cross-Language Documentation + +| Issue | What to Check | +|-------|---------------| +| **Inconsistent resource names** | Different names used across C#/Python/JavaScript examples | +| **Missing variable definitions** | Removing a section that defines variables used later | +| **Wrong environment variable format** | Using `:` vs `__` separator for different languages | + +## Testing Code Examples + +When testing code examples, verify: + +1. **All imports/usings are present** - Code should compile without adding missing imports +2. **Variable names match** - The connection name in client code matches the resource name in AppHost +3. **Complete examples** - Code blocks show runnable examples, not just fragments +4. **Correct package names** - NuGet package names are spelled correctly +5. **Working links** - Links to external resources (GitHub, NuGet) are valid diff --git a/.github/skills/doc-writer/SKILL.md b/.github/skills/doc-writer/SKILL.md new file mode 100644 index 000000000..e070f6bb1 --- /dev/null +++ b/.github/skills/doc-writer/SKILL.md @@ -0,0 +1,790 @@ +--- +name: doc-writer +description: Guidelines for producing accurate and maintainable documentation for the Aspire documentation site. Use when writing or updating user guides, integration docs, tutorials, or any content on aspire.dev. +--- + +# Documentation Writer Skill + +This skill provides guidelines for AI coding agents to help maintainers produce accurate and easy-to-maintain documentation for the Aspire project. The aspire.dev repository is the official documentation site for Aspire, and this skill helps ensure consistent, high-quality documentation. + +## Documentation Overview + +### Site Structure + +**Location**: `src/frontend/src/content/docs/` +**Audience**: Developers using Aspire for cloud-native application development +**Format**: Astro with MDX files +**Build System**: Astro (static site generator with Starlight theme) + +### Documentation Categories + +``` +src/frontend/src/content/docs/ +├── index.mdx # Landing page +├── get-started/ # Getting started guides +│ ├── prerequisites.mdx +│ ├── install-cli.mdx +│ ├── first-app.mdx +│ └── ... +├── app-host/ # AppHost documentation +├── architecture/ # Architecture concepts +├── dashboard/ # Aspire Dashboard docs +├── deployment/ # Deployment guides +├── diagnostics/ # Diagnostics and telemetry +├── extensibility/ # Extensibility guides +├── fundamentals/ # Core concepts +├── integrations/ # Integration documentation +│ ├── ai/ # AI integrations +│ ├── caching/ # Caching integrations +│ ├── cloud/ # Cloud integrations +│ ├── compute/ # Compute integrations +│ ├── databases/ # Database integrations +│ ├── frameworks/ # Framework integrations +│ ├── messaging/ # Messaging integrations +│ ├── observability/ # Observability integrations +│ ├── reverse-proxies/ # Reverse proxy integrations +│ └── security/ # Security integrations +├── reference/ # API reference +├── testing/ # Testing guides +└── whats-new/ # Release notes +``` + +## Astro and MDX Conventions + +### Frontmatter + +Every documentation file requires frontmatter: + +```yaml +--- +title: Page Title +description: A brief summary of the page content (required for SEO) +--- +``` + +Optional frontmatter fields: +- `next: false` - Disable "Next page" link for terminal pages +- Custom metadata as needed by Starlight theme + +### Required Imports + +Import Starlight components at the top of your MDX file: + +```tsx +import { Aside, CardGrid, LinkCard, Steps, Tabs, TabItem, Icon, FileTree } from '@astrojs/starlight/components'; +``` + +Additional commonly used imports: + +```tsx +import { Kbd } from 'starlight-kbd/components' +import LearnMore from '@components/LearnMore.astro'; +import PivotSelector from '@components/PivotSelector.astro'; +import Pivot from '@components/Pivot.astro'; +import ThemeImage from '@components/ThemeImage.astro'; +import InstallPackage from '@components/InstallPackage.astro'; +import InstallDotNetPackage from '@components/InstallDotNetPackage.astro'; +import AsciinemaPlayer from '@components/AsciinemaPlayer.astro'; +import Badge from '@astrojs/starlight/components/Badge.astro'; +import Image from 'astro:assets'; +``` + +### Component Usage + +#### Aside (Callouts) + +Use for tips, notes, cautions, and warnings: + +```mdx + + + + + + + +``` + +#### Steps + +Use for sequential instructions: + +```mdx + + +1. First step with explanation + + ```bash title="Run this command" + aspire new aspire-starter + ``` + +2. Second step + +3. Third step + + +``` + +#### Tabs/TabItem + +Use for language or platform-specific content: + +```mdx + + + +```bash +aspire run +``` + + + + +Press F5 to start debugging. + + + +``` + +#### Pivot/PivotSelector + +Use for programming language selection that persists across page: + +```mdx + + + +C# specific content here. + + + +Python specific content here. + +``` + +#### CardGrid and LinkCard + +Use for navigation and feature highlights: + +```mdx + + + + +``` + +### Code Blocks + +Always include a descriptive title: + +```mdx +```csharp title="C# — AppHost.cs" +var builder = DistributedApplication.CreateBuilder(args); + +var api = builder.AddProject("api"); + +// After adding all resources, run the app... +builder.Build().Run(); +``` +``` + +For JSON configuration: + +```mdx +```json title="JSON — appsettings.json" +{ + "ConnectionStrings": { + "mydb": "Host=localhost;Database=mydb" + } +} +``` +``` + +### Package Installation Components + +For hosting packages: + +```mdx + +``` + +For client/library packages: + +```mdx + +``` + +## Integration Documentation + +### File Location + +Place integration docs in the appropriate category folder under `src/frontend/src/content/docs/integrations/`: + +| Category | Folder | Examples | +|----------|--------|----------| +| AI/ML | `ai/` | Ollama, Azure OpenAI | +| Caching | `caching/` | Redis, Garnet, Valkey | +| Cloud | `cloud/` | Azure, AWS services | +| Compute | `compute/` | Docker, Kubernetes | +| Databases | `databases/` | PostgreSQL, SQL Server, MongoDB | +| Frameworks | `frameworks/` | Python, Rust, Orleans | +| Messaging | `messaging/` | RabbitMQ, Kafka | +| Observability | `observability/` | OpenTelemetry, Prometheus | +| Reverse Proxies | `reverse-proxies/` | YARP | +| Security | `security/` | Keycloak | + +### Integration Documentation Structure + +#### For Hosting-Only Integrations + +```mdx +--- +title: [Technology] integration +description: Learn how to use the [Technology] integration with Aspire. +--- + +import { Aside } from '@astrojs/starlight/components'; +import InstallPackage from '@components/InstallPackage.astro'; +import Image from 'astro:assets'; + +import techIcon from "@assets/icons/technology.svg"; + +Technology logo + +Brief description of the technology and what the integration enables. + +## Hosting integration + + + +### Add [Technology] resource + +```csharp title="C# — AppHost.cs" +var builder = DistributedApplication.CreateBuilder(args); + +var tech = builder.AddTechnology("tech"); + +// After adding all resources, run the app... +builder.Build().Run(); +``` + +### Configuration options + +Describe available configuration methods and options. + +## See also + +- [Official Technology documentation](https://...) +- [Related Aspire documentation](/path/to/related/) +``` + +#### For Hosting + Client Integrations + +Include both hosting and client sections: + +```mdx +## Hosting integration + + + +### Add [Technology] resource + +[Hosting examples...] + +### Hosting integration health checks + +[Health check information if applicable...] + +## Client integration + + + +### Add [Technology] client + +```csharp title="C# — Program.cs" +builder.AddTechnologyClient("tech"); +``` + +### Add keyed [Technology] client + +```csharp title="C# — Program.cs" +builder.AddKeyedTechnologyClient("tech"); +``` + +For more information, see [.NET dependency injection: Keyed services](https://learn.microsoft.com/dotnet/core/extensions/dependency-injection#keyed-services). + +### Configuration + +#### Connection strings + +The connection name must match the resource name defined in the AppHost. + +#### Configuration providers + +```json title="JSON — appsettings.json" +{ + "Aspire": { + "Technology": { + "myconnection": { + "Option1": "value" + } + } + } +} +``` + +### Client integration health checks + +[Health check information...] + +### Observability and telemetry + +[Logging and tracing information...] + +## See also + +- [Official documentation](https://...) +``` + +### Community Toolkit Integrations + +For integrations from the [Aspire Community Toolkit](https://github.com/CommunityToolkit/Aspire), add the badge at the top: + +```mdx +import Badge from '@astrojs/starlight/components/Badge.astro'; + + +``` + +## Updating Navigation + +After creating documentation, update the sidebar configuration: + +### Location + +Edit `src/frontend/config/sidebar/sidebar.topics.ts` (or the appropriate topic file) + +### Adding Entries + +Add entries to the appropriate section in alphabetical order: + +```typescript +{ label: "Technology Name", slug: "integrations/category/technology" } +``` + +For collapsed sections with children: + +```typescript +{ + label: "Technology Name", + collapsed: true, + items: [ + { label: "Overview", slug: "integrations/category/technology" }, + { label: "Advanced", slug: "integrations/category/technology-advanced" }, + ] +} +``` + +### Update Integration Links + +After adding integration documentation, run the update-integrations prompt to ensure the integration is indexed: + +``` +.github/prompts/update-integrations.prompt.md +``` + +## Writing Style Guidelines + +### Voice and Tone + +- Use **second person** ("you") when addressing the reader +- Use **active voice** ("Create a resource" not "A resource is created") +- Use **imperative mood** for instructions ("Call the method" not "You should call the method") +- Be concise but complete +- Be professional but approachable + +### Terminology + +Use consistent terminology throughout: + +| Preferred | Avoid | +|-----------|-------| +| Aspire | .NET Aspire (except in formal/legal contexts) | +| AppHost | App Host, app host | +| resource | component (for AppHost resources) | +| integration | connector, plugin | + +### Inclusive Language + +- Use inclusive, accessible language +- Avoid assumptions about the reader's background +- Use gender-neutral pronouns (they/them) or rewrite to avoid pronouns +- Avoid ableist language (e.g., "blind to", "crippled by") +- Use people-first language when discussing disabilities + +### International Considerations + +- Write dates as "January 15, 2025" not "1/15/25" +- Specify time zones when referencing specific times +- Use diverse, international examples +- Avoid idioms and culturally-specific references + +## Icons and Images + +### Icon Location + +Place icons in `src/frontend/src/assets/icons/` + +### Icon Usage + +```mdx +import Image from 'astro:assets'; +import techIcon from "@assets/icons/technology.svg"; + +Technology logo +``` + +For light/dark theme variants: + +```mdx +import ThemeImage from '@components/ThemeImage.astro'; + + +``` + +### Terminal Recordings (Asciinema) + +For CLI demonstrations, use asciinema recordings (`.cast` files) instead of static code blocks. These provide an interactive, playable terminal experience that better demonstrates command output and timing. + +#### Existing Recordings + +Recordings are stored in `src/frontend/public/casts/`. Check for existing recordings before creating new ones: + +- `aspire-version.cast` - Shows `aspire --version` command +- `aspire-new.cast` - Shows project creation with `aspire new` +- `aspire-run.cast` - Shows running an Aspire app +- `aspire-help.cast` - Shows CLI help output +- `mcp-init.cast` - Shows MCP initialization + +#### Using AsciinemaPlayer + +```mdx +import AsciinemaPlayer from '@components/AsciinemaPlayer.astro'; + + +``` + +**Common props**: +- `src`: Path to the `.cast` file (relative to `public/`) +- `rows`: Terminal height in rows (default: 15) +- `poster`: Frame to show before playback (e.g., `"npt:0:01"` = 1 second in) +- `autoPlay`: Whether to auto-play (default: false) +- `loop`: Whether to loop playback (default: true) +- `speed`: Playback speed multiplier (default: 1.5) +- `idleTimeLimit`: Max idle time between commands (default: 1.5s) + +#### Creating New Recordings with Hex1b MCP + +Use the Hex1b MCP server to create new terminal recordings: + +1. Activate the terminal tools: + ``` + activate_terminal_session_creation_tools + activate_terminal_interaction_tools + ``` + +2. Start a terminal session and record: + ``` + mcp_hex1b_start_bash_terminal # Start a new session + mcp_hex1b_send_terminal_input # Send commands + mcp_hex1b_wait_for_terminal_text # Wait for output + mcp_hex1b_record_asciinema # Save as .cast file + ``` + +3. For screenshots instead of recordings: + ``` + mcp_hex1b_capture_terminal_screenshot # Capture as SVG + mcp_hex1b_capture_terminal_text # Capture as text + ``` + +#### When to Use Recordings vs Code Blocks + +| Content Type | Recommendation | +|--------------|----------------| +| CLI command with dynamic output | Asciinema recording | +| Simple one-liner command | Code block | +| Interactive terminal session | Asciinema recording | +| Configuration files | Code block | +| Long-running process (aspire run) | Asciinema recording | + +## Testing Your Documentation + +Before submitting documentation: + +1. **Build locally**: Run the site locally to verify rendering +2. **Check links**: Ensure all internal and external links work +3. **Validate code**: Test all code examples compile and run using `aspire run` +4. **Review formatting**: Verify components render correctly +5. **Check navigation**: Confirm sidebar entries are correct + +### Installing the Aspire CLI + +Ensure you have the appropriate version of the Aspire CLI installed for testing. The version depends on what you're documenting: + +#### GA/Stable Builds (Default) + +For documenting released features: + +```bash +# Linux/macOS +curl -sSL https://aspire.dev/install.sh | bash + +# Windows (PowerShell) +irm https://aspire.dev/install.ps1 | iex +``` + +For complete installation instructions, see [Install Aspire CLI](/get-started/install-cli/). + +#### Nightly/Dev Builds + +For documenting features on the main branch that haven't been released yet: + +```bash +# Linux/macOS +curl -sSL https://aspire.dev/install.sh | bash -s -- --quality dev + +# Windows (PowerShell) +iex "& { $(irm https://aspire.dev/install.ps1) } -Quality 'dev'" +``` + +You can also access this via the download icon on aspire.dev and selecting "Dev" from the Channel selector. + +#### PR Builds + +For documenting features in specific pull requests before they merge: + +1. Go to the PR in [dotnet/aspire](https://github.com/dotnet/aspire) +2. Find the build artifacts in the Checks/Actions section +3. Download and install the CLI from the PR artifacts + +This is useful for getting an early start on documentation for upcoming features. + +#### Staging Builds + +For prerelease builds from the current release branch: + +```bash +# Linux/macOS +curl -sSL https://aspire.dev/install.sh | bash -s -- --quality staging + +# Windows (PowerShell) +iex "& { $(irm https://aspire.dev/install.ps1) } -Quality 'staging'" +``` + +### Running Locally + +The documentation site can be run locally using the Aspire CLI: + +```bash +aspire run +``` + + + +Use the Aspire MCP tools to check the status of resources: + +``` +mcp_aspire_list_resources +``` + +Navigate to the `frontend` resource endpoint to view the documentation site. + +## Cross-Referencing + +### Link to Related Documentation + +Use standard Markdown links with absolute paths from the docs root: + +```markdown +For more information, see [Service Defaults](/fundamentals/service-defaults/). +``` + +### Reference NuGet Packages + +Use the 📦 emoji with links: + +```markdown +Install the [📦 Aspire.Hosting.Redis](https://nuget.org/packages/Aspire.Hosting.Redis) package. +``` + +### See Also Sections + +End pages with a "See also" section linking to: +- Official technology documentation +- Related Aspire documentation +- NuGet package pages +- GitHub repositories (when applicable) + +## Localization + +The aspire.dev site supports multiple languages. When creating new content: + +1. Create content in the default (English) location first +2. Localized versions are managed separately in their respective folders (e.g., `fr/`, `de/`, `ja/`) +3. Do not manually translate content - follow the project's localization workflow + +## Common Patterns + +### Prerequisites Notes + +```mdx + +``` + +### Version-Specific Information + +```mdx + +``` + +### Feature Flags or Experimental Features + +```mdx + +``` + +## Mermaid Diagrams + +The site supports Mermaid diagrams for architecture visualization: + +```mdx +```mermaid +architecture-beta + service api(logos:dotnet)[API service] + service frontend(aspire:blazor)[Blazor front end] + + frontend:L --> R:api +``` +``` + +Use the `architecture-beta` diagram type for service architecture diagrams. + +## Common Documentation Issues (From PR Feedback) + +The following rules are derived from common feedback patterns in documentation PRs. Following these rules will help avoid common mistakes. + +### General Writing Rules + +1. **Remove unnecessary commas**: Don't write "Now, that you have..." - write "Now that you have..." +2. **Avoid casual language**: Don't include phrases like "treat yourself to a coffee" or other informal asides in documentation +3. **Remove unused imports**: Don't import components that aren't used in the document +4. **Verify all internal links**: Links must point to pages that actually exist. Common mistakes: + - Linking to `/get-started/setup-and-tooling/` instead of `/get-started/prerequisites/` + - Linking to `/reference/cli/` for CLI installation instead of `/get-started/install-cli/` +5. **Add redirects when restructuring**: When moving or renaming documentation pages, add redirect entries in `src/frontend/config/redirects.mjs` + +### Code Example Rules + +1. **Use standard indentation**: For fluent APIs on newlines, use standard 4-space indentation, NOT alignment with the method call above + + ✅ Correct: + ```csharp + builder.AddProject("api") + .WithReference(redis) + .WithExternalHttpEndpoints(); + ``` + + ❌ Incorrect (aligned indentation): + ```csharp + builder.AddProject("api") + .WithReference(redis) + .WithExternalHttpEndpoints(); + ``` + +2. **Code block language identifiers**: Use only one language identifier, not duplicates like `csharp csharp` + +3. **Verify code syntax**: Check for typos in code: + - `main:app` not `main.app` (Python uvicorn module:app format) + - Verify package/module names are correct + +4. **Accurate technical descriptions**: + - `process.env` is an **object**, not a method + - `express` is NOT used to access environment variables (that's `process.env`) + - Don't claim libraries do things they don't do + +5. **Connection string environment variables**: + - For C#/.NET: Use `ConnectionStrings:resourcename` (colon separator) + - For Python/JavaScript: Use `ConnectionStrings__resourcename` (double underscore separator) + - Use the standard `ConnectionStrings__` pattern, not custom variable names like `ELASTICSEARCH_ENDPOINT` + +6. **Don't document deprecated APIs as primary examples**: If an API is deprecated, don't use it as the first or main example. Use current, recommended APIs. + +7. **Avoid insecure defaults in examples**: Don't include `TrustServerCertificate=true` in connection strings without noting it's for development only + +### Component Usage Rules + +1. **Match Pivot components to their PivotSelector**: When using nested Pivot components, ensure they reference the correct parent PivotSelector with the `key` attribute + +2. **Keep LinkCard descriptions concise**: Card descriptions should be short enough to not squeeze the UI. Prefer "Configure persistence..." over "Discover how to configure persistence..." + +3. **Avoid redundant Asides**: Don't have two Asides saying similar things near each other + +### Cross-Language Documentation + +When documenting integrations that support multiple languages (C#, Python, JavaScript): + +1. **Show complete, working examples** for each language +2. **Ensure variable names are defined** before they're used in code examples +3. **Verify the same resource name** is used consistently across language examples +4. **Don't remove code that defines variables** that are used later in the document diff --git a/.gitignore b/.gitignore index ee1befb94..576810bdb 100644 --- a/.gitignore +++ b/.gitignore @@ -422,6 +422,7 @@ FodyWeavers.xsd !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json +!.vscode/mcp.json !.vscode/*.code-snippets # Local History for Visual Studio Code @@ -438,4 +439,11 @@ FodyWeavers.xsd *.msp # Mac folder metadata -.DS_Store \ No newline at end of file +.DS_Store + +# Documentation tester workspace +.doc-tester-workspace/ + + +bin/ +obj/ \ No newline at end of file diff --git a/.mcp.json b/.mcp.json index 6983627df..cbdb20157 100644 --- a/.mcp.json +++ b/.mcp.json @@ -13,6 +13,13 @@ "-y", "@playwright/mcp@latest" ] + }, + "hex1b": { + "command": "dnx", + "args": [ + "Hex1b.McpServer@0.66.0", + "--yes" + ] } } } \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 9a51c0583..db6f4131a 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,7 +2,7 @@ "recommendations": [ "astro-build.astro-vscode", "unifiedjs.vscode-mdx", - "prettier.prettier-vscode" + "esbenp.prettier-vscode" ], "unwantedRecommendations": [] } \ No newline at end of file diff --git a/.vscode/mcp.json b/.vscode/mcp.json new file mode 100644 index 000000000..697307961 --- /dev/null +++ b/.vscode/mcp.json @@ -0,0 +1,28 @@ +{ + "servers": { + "aspire": { + "type": "stdio", + "command": "aspire", + "args": [ + "mcp", + "start" + ] + }, + "playwright": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "@playwright/mcp@latest" + ] + }, + "hex1b": { + "type": "stdio", + "command": "dnx", + "args": [ + "Hex1b.McpServer@0.66.0", + "--yes" + ] + } + } +} \ No newline at end of file diff --git a/opencode.jsonc b/opencode.jsonc index 2f81d7141..646329f98 100644 --- a/opencode.jsonc +++ b/opencode.jsonc @@ -18,6 +18,15 @@ "@playwright/mcp@latest" ], "enabled": true + }, + "hex1b": { + "type": "local", + "command": [ + "dnx", + "Hex1b.McpServer@0.66.0", + "--yes" + ], + "enabled": true } } } \ No newline at end of file diff --git a/src/frontend/frontend.esproj b/src/frontend/frontend.esproj index adb4f0dc4..c72d5c450 100644 --- a/src/frontend/frontend.esproj +++ b/src/frontend/frontend.esproj @@ -1,6 +1,6 @@  - $(MSBuildProjectDirectory)\dist + $(MSBuildProjectDirectory)/dist pnpm run build false diff --git a/src/frontend/src/data/aspire-integration-names.json b/src/frontend/src/data/aspire-integration-names.json new file mode 100644 index 000000000..343d800c1 --- /dev/null +++ b/src/frontend/src/data/aspire-integration-names.json @@ -0,0 +1,141 @@ +[ + "Aspire.Azure.AI.Inference", + "Aspire.Azure.AI.OpenAI", + "Aspire.Azure.Data.Tables", + "Aspire.Azure.Messaging.EventHubs", + "Aspire.Azure.Messaging.ServiceBus", + "Aspire.Azure.Messaging.WebPubSub", + "Aspire.Azure.Npgsql", + "Aspire.Azure.Npgsql.EntityFrameworkCore.PostgreSQL", + "Aspire.Azure.Search.Documents", + "Aspire.Azure.Security.KeyVault", + "Aspire.Azure.Storage.Blobs", + "Aspire.Azure.Storage.Queues", + "Aspire.Confluent.Kafka", + "Aspire.Elastic.Clients.Elasticsearch", + "Aspire.Hosting.AWS", + "Aspire.Hosting.Azure.AIFoundry", + "Aspire.Hosting.Azure.AppConfiguration", + "Aspire.Hosting.Azure.AppContainers", + "Aspire.Hosting.Azure.ApplicationInsights", + "Aspire.Hosting.Azure.AppService", + "Aspire.Hosting.Azure.CognitiveServices", + "Aspire.Hosting.Azure.ContainerRegistry", + "Aspire.Hosting.Azure.CosmosDB", + "Aspire.Hosting.Azure.EventHubs", + "Aspire.Hosting.Azure.Functions", + "Aspire.Hosting.Azure.KeyVault", + "Aspire.Hosting.Azure.Kusto", + "Aspire.Hosting.Azure.OperationalInsights", + "Aspire.Hosting.Azure.PostgreSQL", + "Aspire.Hosting.Azure.Redis", + "Aspire.Hosting.Azure.Search", + "Aspire.Hosting.Azure.ServiceBus", + "Aspire.Hosting.Azure.SignalR", + "Aspire.Hosting.Azure.Sql", + "Aspire.Hosting.Azure.Storage", + "Aspire.Hosting.Azure.WebPubSub", + "Aspire.Hosting.DevTunnels", + "Aspire.Hosting.Docker", + "Aspire.Hosting.Elasticsearch", + "Aspire.Hosting.Garnet", + "Aspire.Hosting.GitHub.Models", + "Aspire.Hosting.JavaScript", + "Aspire.Hosting.Kafka", + "Aspire.Hosting.Keycloak", + "Aspire.Hosting.Kubernetes", + "Aspire.Hosting.Maui", + "Aspire.Hosting.Milvus", + "Aspire.Hosting.MongoDB", + "Aspire.Hosting.MySql", + "Aspire.Hosting.Nats", + "Aspire.Hosting.OpenAI", + "Aspire.Hosting.Oracle", + "Aspire.Hosting.Orleans", + "Aspire.Hosting.PostgreSQL", + "Aspire.Hosting.Python", + "Aspire.Hosting.Qdrant", + "Aspire.Hosting.RabbitMQ", + "Aspire.Hosting.Redis", + "Aspire.Hosting.Seq", + "Aspire.Hosting.SqlServer", + "Aspire.Hosting.Testing", + "Aspire.Hosting.Valkey", + "Aspire.Hosting.Yarp", + "Aspire.Keycloak.Authentication", + "Aspire.Microsoft.AspNetCore.SystemWebAdapters", + "Aspire.Microsoft.Azure.Cosmos", + "Aspire.Microsoft.Azure.StackExchangeRedis", + "Aspire.Microsoft.Data.SqlClient", + "Aspire.Microsoft.EntityFrameworkCore.Cosmos", + "Aspire.Microsoft.EntityFrameworkCore.SqlServer", + "Aspire.Microsoft.Extensions.Configuration.AzureAppConfiguration", + "Aspire.Milvus.Client", + "Aspire.MongoDB.Driver", + "Aspire.MongoDB.Driver.v2", + "Aspire.MySqlConnector", + "Aspire.NATS.Net", + "Aspire.Npgsql", + "Aspire.Npgsql.EntityFrameworkCore.PostgreSQL", + "Aspire.OpenAI", + "Aspire.Oracle.EntityFrameworkCore", + "Aspire.Pomelo.EntityFrameworkCore.MySql", + "Aspire.Qdrant.Client", + "Aspire.RabbitMQ.Client", + "Aspire.RabbitMQ.Client.v6", + "Aspire.Seq", + "Aspire.StackExchange.Redis", + "Aspire.StackExchange.Redis.DistributedCaching", + "Aspire.StackExchange.Redis.OutputCaching", + "CommunityToolkit.Aspire.GoFeatureFlag", + "CommunityToolkit.Aspire.Hosting.ActiveMQ", + "CommunityToolkit.Aspire.Hosting.Adminer", + "CommunityToolkit.Aspire.Hosting.Azure.Dapr", + "CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis", + "CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder", + "CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps", + "CommunityToolkit.Aspire.Hosting.Bun", + "CommunityToolkit.Aspire.Hosting.Dapr", + "CommunityToolkit.Aspire.Hosting.Dapr.AzureRedis", + "CommunityToolkit.Aspire.Hosting.DbGate", + "CommunityToolkit.Aspire.Hosting.Deno", + "CommunityToolkit.Aspire.Hosting.Flagd", + "CommunityToolkit.Aspire.Hosting.GoFeatureFlag", + "CommunityToolkit.Aspire.Hosting.Golang", + "CommunityToolkit.Aspire.Hosting.Java", + "CommunityToolkit.Aspire.Hosting.JavaScript.Extensions", + "CommunityToolkit.Aspire.Hosting.k6", + "CommunityToolkit.Aspire.Hosting.Keycloak.Extensions", + "CommunityToolkit.Aspire.Hosting.KurrentDB", + "CommunityToolkit.Aspire.Hosting.LavinMQ", + "CommunityToolkit.Aspire.Hosting.MailPit", + "CommunityToolkit.Aspire.Hosting.McpInspector", + "CommunityToolkit.Aspire.Hosting.Meilisearch", + "CommunityToolkit.Aspire.Hosting.Minio", + "CommunityToolkit.Aspire.Hosting.MongoDB.Extensions", + "CommunityToolkit.Aspire.Hosting.MySql.Extensions", + "CommunityToolkit.Aspire.Hosting.Ngrok", + "CommunityToolkit.Aspire.Hosting.Ollama", + "CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector", + "CommunityToolkit.Aspire.Hosting.PapercutSmtp", + "CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions", + "CommunityToolkit.Aspire.Hosting.PowerShell", + "CommunityToolkit.Aspire.Hosting.Python.Extensions", + "CommunityToolkit.Aspire.Hosting.RavenDB", + "CommunityToolkit.Aspire.Hosting.Redis.Extensions", + "CommunityToolkit.Aspire.Hosting.Rust", + "CommunityToolkit.Aspire.Hosting.Solr", + "CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects", + "CommunityToolkit.Aspire.Hosting.Sqlite", + "CommunityToolkit.Aspire.Hosting.SqlServer.Extensions", + "CommunityToolkit.Aspire.Hosting.SurrealDb", + "CommunityToolkit.Aspire.KurrentDB", + "CommunityToolkit.Aspire.MassTransit.RabbitMQ", + "CommunityToolkit.Aspire.Meilisearch", + "CommunityToolkit.Aspire.Microsoft.Data.Sqlite", + "CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite", + "CommunityToolkit.Aspire.Minio.Client", + "CommunityToolkit.Aspire.OllamaSharp", + "CommunityToolkit.Aspire.RavenDB.Client", + "CommunityToolkit.Aspire.SurrealDb" +] \ No newline at end of file From 271a7161b6fc42c150c829b46790e791a43f22d4 Mon Sep 17 00:00:00 2001 From: Mitch Denny Date: Tue, 3 Feb 2026 13:48:52 +1100 Subject: [PATCH 10/10] Fix PowerShell syntax in telemetry opt-out example --- .../docs/reference/cli/microsoft-collected-cli-telemetry.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 b2b0a4d82..6110bca91 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 @@ -26,7 +26,7 @@ export ASPIRE_CLI_TELEMETRY_OPTOUT=true
```powershell -$env:ASPIRE_CLI_TELEMETRY_OPTOUT= "true" +$env:ASPIRE_CLI_TELEMETRY_OPTOUT="true" ```