Skip to content

Detect GitHub Copilot App as an agent client - #19820

Merged
Ella Hathaway (ellahathaway) merged 16 commits into
mainfrom
ellahathaway-copilot-app-detection
Sep 2, 2026
Merged

Ella Hathaway (ellahathaway) merged 16 commits into
mainfrom
ellahathaway-copilot-app-detection

Conversation

@ellahathaway

@ellahathaway Ella Hathaway (ellahathaway) commented Aug 31, 2026 •

Copy link
Copy Markdown
Contributor

Description

The GitHub Copilot App and Copilot CLI share the Copilot runtime, MCP configuration, skills, and hooks, but Aspire previously detected and configured only the CLI. That meant an App-only installation was not represented during aspire agent init.

This adds AgentClientKind.CopilotApp and consolidates Copilot environment discovery in CopilotAgentEnvironmentScanner. The scanner independently probes the CLI and App, records CopilotCli, CopilotApp, or both, and adds their shared Aspire MCP, skill, and Playwright configuration once. Existing CLI-only behavior is preserved. Shared configuration honors COPILOT_HOME, falling back to ~/.copilot.

The App installation probe recognizes the runtime AI_AGENT=github_copilot_app_agent marker, Windows executables, macOS app bundles, and Linux desktop entries. Linux lookup follows the freedesktop base-directory contract by honoring XDG_DATA_HOME and XDG_DATA_DIRS, ignoring relative entries, and using the standard fallback roots.

Telemetry continues to describe where each Copilot action occurred: App events are tagged copilot-app, while standalone CLI events are tagged copilot-cli. The App marker takes precedence because App sessions also set COPILOT_CLI; Claude and VS Code retain their existing payload-based fallback detection when Copilot markers are absent. Coding-agent telemetry remains independently keyed to the hardcoded AI_AGENT marker.

This is the first, self-contained layer of the work related to #19013.

Validation

Focused coverage includes App-only, CLI-only, both-client, and neither-client scanning; shared applicator deduplication; COPILOT_HOME; Windows, macOS, Linux/XDG, and runtime App markers; MCP configuration preservation and malformed/non-object/null failures; hook registration; and App, CLI, Claude, and VS Code telemetry attribution.

dotnet test --project tests\Aspire.Cli.Tests\Aspire.Cli.Tests.csproj --no-launch-profile -- --filter-method "*.CopilotAgentEnvironmentScannerTests.*" --filter-method "*.CopilotAppInstallationDetectorTests.*" --filter-method "*.CopilotCliRunnerTests.*" --filter-method "*.ClaudeCodeAgentEnvironmentScannerTests.*" --filter-method "*.OpenCodeAgentEnvironmentScannerTests.*" --filter-method "*.VsCodeAgentEnvironmentScannerTests.*" --filter-method "*.TelemetryHookConfiguratorTests.*" --filter-method "*.TelemetryHookScriptTests.*" --filter-method "*.AgentInitCommand_DefaultOn_InstallsTelemetryHook_ForDetectedClient" --filter-method "*.CodingAgentDetector_DetectsKnownCodingAgents" --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true"

Passed: 140, Failed: 0, Skipped: 0

Related to #19013

Checklist

  • Is this feature complete?
    • Yes. Ready to ship.
    • No. Follow-up changes expected.
  • Are you including unit tests for the changes and scenario tests if relevant?
    • Yes
    • No
  • Did you add public API?
    • Yes
      • If yes, did you have an API Review for it?
        • Yes
        • No
      • Did you add <remarks /> and <code /> elements on your triple slash comments?
        • Yes
        • No
    • No
  • Does the change make any security assumptions or guarantees?
    • Yes
      • If yes, have you done a threat model and had a security review?
        • Yes
        • No
    • No

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

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 19820

Or

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

@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds GitHub Copilot App detection to Aspire CLI agent scanning.

Changes:

  • Detects runtime and platform-specific installation markers.
  • Registers the scanner and client kind.
  • Adds platform and telemetry tests.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
src/Aspire.Cli/Program.cs Registers detection services.
src/Aspire.Cli/Agents/AgentClientKind.cs Adds the Copilot App client kind.
src/Aspire.Cli/Agents/CopilotApp/CopilotAppInstallationDetector.cs Detects platform installation markers.
src/Aspire.Cli/Agents/CopilotApp/CopilotAppAgentEnvironmentScanner.cs Records detected installations.
tests/Aspire.Cli.Tests/Agents/CopilotAppAgentEnvironmentScannerTests.cs Tests scanner behavior.
tests/Aspire.Cli.Tests/Telemetry/AspireCliTelemetryTests.cs Tests exact telemetry marker matching.

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

@ellahathaway
Ella Hathaway (ellahathaway) marked this pull request as draft August 31, 2026 19:27
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dfca4c57-330a-406c-b8d2-eada8bddec9a
Copilot AI review requested due to automatic review settings August 31, 2026 19:44
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dfca4c57-330a-406c-b8d2-eada8bddec9a
@github-actions

This comment has been minimized.

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

Copilot-Session: dfca4c57-330a-406c-b8d2-eada8bddec9a

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 13 out of 13 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/Aspire.Cli/Agents/CopilotApp/CopilotAppInstallationDetector.cs:78

  • The Linux detector hard-codes only ~/.local/share and /usr/share, so it misses valid desktop entries under $XDG_DATA_HOME, customized $XDG_DATA_DIRS, and the default /usr/local/share. On those systems the App is not recorded and agent init will skip its shared telemetry hook. Resolve the XDG data locations (defaulting to ~/.local/share and /usr/local/share:/usr/share) and search each applications directory.
            return FindLinuxDesktopEntry(
                Path.Combine(executionContext.HomeDirectory.FullName, ".local", "share", "applications"))
                ?? FindLinuxDesktopEntry(
                    Path.Combine(Path.DirectorySeparatorChar.ToString(), "usr", "share", "applications"));

Copilot AI review requested due to automatic review settings August 31, 2026 19:54
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dfca4c57-330a-406c-b8d2-eada8bddec9a
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dfca4c57-330a-406c-b8d2-eada8bddec9a
@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

Suppressed comments (1)

src/Aspire.Cli/Agents/CopilotApp/CopilotAppInstallationDetector.cs:78

  • The Linux search omits valid XDG application directories. Desktop entries may live under $XDG_DATA_HOME/applications and each $XDG_DATA_DIRS/applications; even with default variables, /usr/local/share/applications must also be searched. An AppImage integrated into any of those locations is currently missed, so resolve the XDG variables with their standard fallbacks before scanning.
        if (environment.IsLinux())
        {
            return FindLinuxDesktopEntry(
                Path.Combine(executionContext.HomeDirectory.FullName, ".local", "share", "applications"))
                ?? FindLinuxDesktopEntry(
                    Path.Combine(Path.DirectorySeparatorChar.ToString(), "usr", "share", "applications"));

Copilot AI review requested due to automatic review settings August 31, 2026 20:01
@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/Aspire.Cli/Agents/CopilotApp/CopilotAppInstallationDetector.cs:78

  • The Linux scan bypasses the XDG search path. A desktop entry under $XDG_DATA_HOME/applications, $XDG_DATA_DIRS, or the default /usr/local/share/applications is visible to the desktop environment but will not detect the App here. Resolve XDG_DATA_HOME (defaulting to ~/.local/share) and enumerate XDG_DATA_DIRS (defaulting to /usr/local/share:/usr/share), with coverage for overridden paths.
            return FindLinuxDesktopEntry(
                Path.Combine(executionContext.HomeDirectory.FullName, ".local", "share", "applications"))
                ?? FindLinuxDesktopEntry(
                    Path.Combine(Path.DirectorySeparatorChar.ToString(), "usr", "share", "applications"));

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

Copilot-Session: dfca4c57-330a-406c-b8d2-eada8bddec9a
Copilot AI review requested due to automatic review settings August 31, 2026 20:42
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

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

Copilot-Session: dfca4c57-330a-406c-b8d2-eada8bddec9a
Copilot AI review requested due to automatic review settings September 1, 2026 17:20
@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 34 out of 34 changed files in this pull request and generated 1 comment.

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

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

Copilot-Session: dfca4c57-330a-406c-b8d2-eada8bddec9a
Copilot AI review requested due to automatic review settings September 1, 2026 17:51
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Tests selector

2 / 99 PR test projects · 3 PR jobs · 1 advisory-only target, from 52 changed files.

Selected PR test projects (2 / 99)

Aspire.Cli.EndToEnd.Tests, Aspire.Cli.Tests

Selected PR jobs (3)

extension-e2e, polyglot, typescript-api-compat

Advisory workflow impact (1)

  • deployment-e2e (schedule/dispatch-only)

How these were chosen — grouped by what changed

📦 affected project Aspire.Cli
→ 1 test: Aspire.Cli.EndToEnd.Tests

🧪 tests/Aspire.Cli.Tests/Agents/CopilotAgentEnvironmentScannerTests.cs (changed test)
→ 1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/Agents/CopilotAppInstallationDetectorTests.cs (changed test)
→ 1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/Agents/CopilotCliAgentEnvironmentScannerTests.cs (changed test)
→ 1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/Agents/CopilotCliRunnerTests.cs (changed test)
→ 1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/Agents/TelemetryHookConfiguratorTests.cs (changed test)
→ 1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/Agents/TelemetryHookScriptTests.cs (changed test)
→ 1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/Commands/AgentInitCommandTests.cs (changed test)
→ 1 directly: Aspire.Cli.Tests

Job reasons

Job Triggered by
deployment-e2e affected project Aspire.Cli
extension-e2e • src/Aspire.Cli/Agents/AgentClientKind.cs, src/Aspire.Cli/Agents/Copilot/CopilotAgentEnvironmentScanner.cs, src/Aspire.Cli/Agents/Copilot/CopilotAppInstallationDetector.cs, src/Aspire.Cli/Agents/Copilot/CopilotCliRunner.cs, src/Aspire.Cli/Agents/Copilot/CopilotPaths.cs, src/Aspire.Cli/Agents/Copilot/ICopilotCliRunner.cs, src/Aspire.Cli/Agents/CopilotCli/CopilotCliAgentEnvironmentScanner.cs, src/Aspire.Cli/Agents/CopilotCli/CopilotCliRunner.cs, src/Aspire.Cli/Agents/CopilotCli/ICopilotCliRunner.cs, src/Aspire.Cli/Agents/Hooks/TelemetryHookConfigurator.cs, src/Aspire.Cli/Agents/Hooks/track-telemetry.ps1, src/Aspire.Cli/Agents/Hooks/track-telemetry.sh, src/Aspire.Cli/Agents/McpConfigFileHelper.cs, src/Aspire.Cli/Commands/AgentInitCommand.cs, src/Aspire.Cli/Program.cs, src/Aspire.Cli/Resources/CopilotAgentEnvironmentScannerStrings.Designer.cs, src/Aspire.Cli/Resources/CopilotAgentEnvironmentScannerStrings.resx, src/Aspire.Cli/Resources/CopilotCliAgentEnvironmentScannerStrings.Designer.cs, src/Aspire.Cli/Resources/CopilotCliAgentEnvironmentScannerStrings.resx, src/Aspire.Cli/Resources/xlf/CopilotAgentEnvironmentScannerStrings.cs.xlf, src/Aspire.Cli/Resources/xlf/CopilotAgentEnvironmentScannerStrings.de.xlf, src/Aspire.Cli/Resources/xlf/CopilotAgentEnvironmentScannerStrings.es.xlf, src/Aspire.Cli/Resources/xlf/CopilotAgentEnvironmentScannerStrings.fr.xlf, src/Aspire.Cli/Resources/xlf/CopilotAgentEnvironmentScannerStrings.it.xlf, src/Aspire.Cli/Resources/xlf/CopilotAgentEnvironmentScannerStrings.ja.xlf, src/Aspire.Cli/Resources/xlf/CopilotAgentEnvironmentScannerStrings.ko.xlf, src/Aspire.Cli/Resources/xlf/CopilotAgentEnvironmentScannerStrings.pl.xlf, src/Aspire.Cli/Resources/xlf/CopilotAgentEnvironmentScannerStrings.pt-BR.xlf, src/Aspire.Cli/Resources/xlf/CopilotAgentEnvironmentScannerStrings.ru.xlf, src/Aspire.Cli/Resources/xlf/CopilotAgentEnvironmentScannerStrings.tr.xlf, src/Aspire.Cli/Resources/xlf/CopilotAgentEnvironmentScannerStrings.zh-Hans.xlf, src/Aspire.Cli/Resources/xlf/CopilotAgentEnvironmentScannerStrings.zh-Hant.xlf, src/Aspire.Cli/Resources/xlf/CopilotCliAgentEnvironmentScannerStrings.cs.xlf, src/Aspire.Cli/Resources/xlf/CopilotCliAgentEnvironmentScannerStrings.de.xlf, src/Aspire.Cli/Resources/xlf/CopilotCliAgentEnvironmentScannerStrings.es.xlf, src/Aspire.Cli/Resources/xlf/CopilotCliAgentEnvironmentScannerStrings.fr.xlf, src/Aspire.Cli/Resources/xlf/CopilotCliAgentEnvironmentScannerStrings.it.xlf, src/Aspire.Cli/Resources/xlf/CopilotCliAgentEnvironmentScannerStrings.ja.xlf, src/Aspire.Cli/Resources/xlf/CopilotCliAgentEnvironmentScannerStrings.ko.xlf, src/Aspire.Cli/Resources/xlf/CopilotCliAgentEnvironmentScannerStrings.pl.xlf, src/Aspire.Cli/Resources/xlf/CopilotCliAgentEnvironmentScannerStrings.pt-BR.xlf, src/Aspire.Cli/Resources/xlf/CopilotCliAgentEnvironmentScannerStrings.ru.xlf, src/Aspire.Cli/Resources/xlf/CopilotCliAgentEnvironmentScannerStrings.tr.xlf, src/Aspire.Cli/Resources/xlf/CopilotCliAgentEnvironmentScannerStrings.zh-Hans.xlf, src/Aspire.Cli/Resources/xlf/CopilotCliAgentEnvironmentScannerStrings.zh-Hant.xlf, tests/Aspire.Cli.Tests/Agents/CopilotAgentEnvironmentScannerTests.cs, tests/Aspire.Cli.Tests/Agents/CopilotAppInstallationDetectorTests.cs, tests/Aspire.Cli.Tests/Agents/CopilotCliAgentEnvironmentScannerTests.cs, tests/Aspire.Cli.Tests/Agents/CopilotCliRunnerTests.cs, tests/Aspire.Cli.Tests/Agents/TelemetryHookConfiguratorTests.cs, tests/Aspire.Cli.Tests/Agents/TelemetryHookScriptTests.cs, tests/Aspire.Cli.Tests/Commands/AgentInitCommandTests.cs
• affected project Aspire.Cli
polyglot affected project Aspire.Cli
typescript-api-compat affected project Aspire.Cli

Selection computed for commit eabc914.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 34 out of 34 changed files in this pull request and generated no new comments.

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@mitchdenny

Copy link
Copy Markdown
Member

I'm concerned that the Linux installation detection may not work for the default distribution path. The official Linux download is an AppImage, and launching an AppImage directly does not normally install its embedded .desktop entry into an XDG applications directory. This detector therefore only recognizes an AppImage user when either they have separately integrated it with their desktop environment or aspire agent init runs inside an App session with AI_AGENT=github_copilot_app_agent.

For an App-only Linux user running aspire agent init from a normal terminal, neither marker may exist, so Copilot is not detected and the Aspire MCP configuration and telemetry hook are skipped. The current Linux test creates a synthetic .desktop entry, so it does not cover the official download-and-run experience.

There may not be a completely reliable installation marker given the diverse ways portable AppImages can be stored and launched. Is there another marker the App always creates after first launch? If not, we may need an explicit Copilot configuration path or to document this limitation rather than treating a desktop entry as representative of the standard Linux installation.

@mitchdenny

Copy link
Copy Markdown
Member

PR Testing Report

PR Information

  • PR Number: Detect GitHub Copilot App as an agent client #19820
  • Title: Detect GitHub Copilot App as an agent client
  • Head Commit: eabc9140e416bab08e691c7a0cb4c7802e300d83
  • Tested At: 2026-09-02T02:21:42Z
  • Environment: Aspire PR container runner on Ubuntu 24.04, Linux ARM64

Artifact Version Verification

  • Expected Commit: eabc9140e416bab08e691c7a0cb4c7802e300d83
  • Installed Version: 13.6.0-pr.19820.geabc9140
  • Status: Verified

Changes Analyzed

Files Changed

  • src/Aspire.Cli/Agents/Copilot/ - Consolidated Copilot CLI/App scanning and added platform installation detection.
  • src/Aspire.Cli/Agents/Hooks/ - Added shared Copilot App/CLI telemetry hook configuration and runtime attribution.
  • src/Aspire.Cli/Agents/McpConfigFileHelper.cs - Hardened shared MCP JSON handling.
  • src/Aspire.Cli/Commands/AgentInitCommand.cs and src/Aspire.Cli/Program.cs - Wired detection and hook configuration into aspire agent init.
  • src/Aspire.Cli/Resources/ - Updated localized Copilot scanner text.
  • tests/Aspire.Cli.Tests/ - Added detector, scanner, hook, script, and command coverage.

Change Categories

  • CLI changes
  • Test changes
  • Hosting integration changes
  • Dashboard changes
  • Client/component changes
  • Template changes
  • VS Code extension changes
  • CI infrastructure changes

Test Scenarios Executed

Scenario 1: PR Artifact Verification

Objective: Verify the tested CLI artifact was produced from the current PR head.
Coverage Type: Artifact integrity
Status: Passed

The dogfood installer selected workflow run 33540228120. The installed CLI reported 13.6.0-pr.19820.geabc9140, matching the current PR head.

Evidence: version.txt

Scenario 2: Copilot CLI-Only Detection on Linux

Objective: Verify a valid copilot --version result detects Copilot CLI without the GitHub Copilot App.
Coverage Type: Happy path
Status: Passed

A PATH-isolated copilot executable returned GitHub Copilot CLI 1.0.0. aspire agent init identified GitHub Copilot CLI and created .copilot/hooks/aspire-telemetry.json.

Evidence: scenarios/cli-only/output.log

Scenario 3: Copilot App Runtime Detection on Linux

Objective: Verify the App runtime marker detects the App without Copilot CLI.
Coverage Type: Happy path
Status: Passed

With AI_AGENT=github_copilot_app_agent, aspire agent init identified GitHub Copilot App and created its telemetry hook.

Evidence: scenarios/app-runtime/output.log

Scenario 4: Desktop-Integrated AppImage Detection

Objective: Verify an AppImage integrated through a freedesktop entry is detected through XDG_DATA_HOME.
Coverage Type: Happy path/boundary
Status: Passed

A valid GitHub Copilot desktop entry under an overridden XDG applications directory was detected, and the Copilot telemetry hook was created.

Evidence: scenarios/app-desktop/output.log

Scenario 5: Portable AppImage Without Desktop Integration

Objective: Verify the official portable installation shape can be detected when no optional desktop integration is performed.
Coverage Type: Negative/regression
Status: Failed

A portable GitHub-Copilot-linux-x64.AppImage marker was placed under the user's applications directory with no AI_AGENT, Copilot CLI, or XDG desktop entry. aspire agent init did not detect GitHub Copilot App and did not create the telemetry hook.

This confirms the Linux detector depends on optional desktop integration outside an active App session. Users who download and directly launch the official AppImage may not be detected when they later run aspire agent init from a normal terminal.

Evidence: scenarios/appimage-only/output.log, detection-matrix-console.log

Scenario 6: App MCP and Hook Configuration With COPILOT_HOME

Objective: Verify App detection configures the shared MCP server and telemetry hook in an overridden Copilot home.
Coverage Type: Happy path/boundary
Status: Passed

The interactive agent init flow selected the Aspire MCP option. It added mcpServers.aspire to the overridden COPILOT_HOME/mcp-config.json and created COPILOT_HOME/hooks/aspire-telemetry.json.

Evidence: app-valid-config-evidence.log, scenarios/app-valid-config/copilot/mcp-config.json, scenarios/app-valid-config/copilot/hooks/aspire-telemetry.json

Scenario 7: Malformed Existing MCP Configuration

Objective: Verify malformed user configuration is preserved and reported without suppressing independent hook setup.
Coverage Type: Unhappy path
Status: Passed

The CLI reported the malformed JSON, preserved the file byte-for-byte, returned the expected configuration-error result, and still installed the Copilot App telemetry hook.

Expected Unhappy-Path Outcome: Clear error, non-success result, no destructive MCP rewrite, and independent hook configuration remains functional.

Evidence: scenarios/malformed-config/output.log, scenarios/malformed-config/copilot/mcp-config.json, scenarios/malformed-config/copilot/hooks/aspire-telemetry.json

Scenario 8: General CLI Smoke Test

Objective: Verify the PR artifact can create, start, describe, and stop a fresh minimal Aspire app.
Coverage Type: Regression smoke test
Status: Passed

The PR hive created a C# single-file AppHost. After installing the required .NET 10 SDK in the test workspace, the AppHost started, describe completed, and stop shut it down successfully.

Evidence: smoke/new.log, smoke/start.log, smoke/describe.log, smoke/stop.log

Summary

Scenario Status Notes
Artifact verification Passed Installed version matched PR head
Copilot CLI-only detection Passed CLI identity and hook verified
App runtime detection Passed Runtime marker and hook verified
Desktop-integrated AppImage Passed XDG override and desktop entry verified
Portable AppImage only Failed App not detected without optional desktop integration
App MCP and hook configuration Passed Shared COPILOT_HOME output verified
Malformed MCP configuration Passed Safe failure and file preservation verified
General CLI smoke test Passed Create/start/describe/stop completed

Overall Result

ISSUE FOUND

The tested PR artifact behaves correctly for Copilot CLI, active Copilot App sessions, and desktop-integrated AppImages. It does not detect a standalone Linux AppImage from a normal terminal unless the user has separately installed a freedesktop entry. Given portable AppImages can live anywhere, a universal filesystem probe may not be practical; the implementation needs another persistent App-created marker, an explicit configuration path, or clear documentation of this limitation.

@mitchdenny Mitch Denny (mitchdenny) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Approved. The Linux portable-AppImage detection limitation is acceptable for now; users with Copilot CLI still receive the shared Aspire MCP, skills, and hook configuration.

@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

⚠️ CI Failure Analysis: Possible Flaky Test(s)

The CI build failed due to test failure(s) that appear unrelated to the PR changes. These may be flaky tests.

Suspected flaky test(s):

Suggested actions:

  • Re-run the failed CI jobs to confirm if the failure is intermittent
  • If the test continues to fail, consider quarantining it using /quarantine-test <test name> <issue URL>
  • Search existing issues to see if this test is already known to be flaky

You can re-run the failed jobs from the workflow run page.

David Pine (IEvangelist) added a commit to microsoft/aspire.dev that referenced this pull request Sep 28, 2026
…ps (#1780)

## Summary

<!-- Describe what this pull request changes and why. -->

Reconcile the 13.6 wiki audit and **all 25 open `docs-from-code`
proposals targeting `release/13.6`** against the actual release source.
Add missing canonical guidance rather than putting all coverage in
What's new. This is a new, isolated feature PR into `release/13.6`; it
does not update the release rollup #1599, merge or close another
proposal, or push directly to a release branch.

**Draft with explicit remaining packaging/validation gates:** the six
REPL walkthroughs are source-verified, but current publicly available
13.6 packages do not contain the late `WithRepl` exports. Generated API
catalogs have deliberately not been fabricated or refreshed from 14.x.
See the open checklist below.

### Evidence baseline

- Documentation base: `717442f6666948bcf77f3d704dc2dadf7c080ec2`.
- Product source of truth:
[`microsoft/aspire@e8fd6fbb954f50ccd2e66479538392f65e13e71d`](https://github.com/microsoft/aspire/tree/e8fd6fbb954f50ccd2e66479538392f65e13e71d),
current `release/13.6` at audit time. Source was read from that Git
object, not the stale source working directory.
- [13.6 wiki](https://github.com/microsoft/aspire/wiki/13.6-Change-log)
snapshot `8e01a371d4f16a1306e48174d4cf1fdeca714348`, whose cutoff is
product PR 20511. Later backports 20541/20546/20548 are included here.
- Proposal base branches alone were **not** used as proof of release
membership. Direct ancestry and known release backports were checked.
Four fallback-targeted proposals are excluded below.
- Wiki link corrections: its REPL link #1752 actually covers Sandboxes;
the REPL proposal is #1740. Its AOT link #1714 covers PFX certificates,
not AOT.

### Complete audit-gap checklist

Checked items mean documentation coverage is implemented, not that cloud
deployment or every product runtime scenario was executed.

- [x] **1. Dotnet API graduation:** correct removal to **13.6**, not
14.0, in What's new, both Dotnet guides, and the diagnostic page;
preserve the prerelease package caveat. This applies to core
`AddDotnetProject`, `DotnetProjectResource`, and related
`WithBuildEnvironment` overloads, not all uses of the diagnostic.
Source: microsoft/aspire#20496.
- [x] **2. Sandboxes:** remove obsolete API suppressions in the article
and deployment guide while preserving Azure service preview/access and
prerelease package limitations. Source: microsoft/aspire#20483.
- [x] **3. Docked REPL documentation:** all six
PostgreSQL/MySQL/MongoDB/SQL Server/Redis/Valkey guides plus the article
now cover opt-in `WithRepl`/`withRepl`, run-only availability, actual
client privileges, credential handling, and explicit exit versus closing
a viewer. Source: microsoft/aspire#20419, backport of
microsoft/aspire#20231. Package-backed checks remain open below.
- [x] **4. Terminal CLI flag:** update current 13.6 article,
`with-terminal`, and all three terminal command references. Preserve
`terminals.v1` and experimental hosting API distinctions. Current
configuration/schema data had no flag entry to remove; historical 13.5
notes remain historical. Source: microsoft/aspire#20548.
- [x] **5. First-party Rust:** rewrite both canonical Rust guides around
`Aspire.Hosting.Rust`; document Cargo versus application arguments,
typed targets, debugging, generated Dockerfiles, workspace context, ABI
constraints, and Toolkit migration. Bacon remains explicitly
Toolkit-only. Add exact first-party package mapping. Source:
microsoft/aspire#18906 and current Rust README.
- [x] **6. Agent setup:** align command reference, skills guide,
AI-agent guide, and article on MCP opt-in, `--mcp`,
chained/non-interactive behavior, seven-skill catalog, Project v2
migration, and Copilot app detection. Also fix stale default-selection
text: all applicable bundle skills are preselected; companion tools
remain opt-in. Sources: microsoft/aspire#19893, microsoft/aspire#20405,
microsoft/aspire#19820.
- [x] **7. Deno AppHost runtime:** document Deno 2+ detection, commands,
permissions, native watch/type checking, doctor, and `DENO_CERT`,
separately from Deno guest hosting. Source: microsoft/aspire#18627,
distinct from microsoft/aspire#18628.
- [x] **8. Native AOT / Fluent UI v5:** concise article, dashboard
exploration, and standalone guidance; automatic packaged-dashboard
selection, no invented performance figures. Source:
microsoft/aspire#19565 and release packaging sources.
- [x] **9. NuGet:** document bundled in-process operations, credential
providers, non-interactive authentication, and realistic
troubleshooting. Correct the proposal's `dotnet nuget locals`
authentication advice: cache commands do not authenticate a feed.
Source: microsoft/aspire#20391.
- [x] **10. Multithreaded builds:** article and coordinated-build guide
explain `-mt`, SDK detection, distinct project/file-based SDK floors,
and fallback. Source: microsoft/aspire#20441.
- [x] **11. Radius:** add a real deployment guide with C#/TypeScript
setup, recipe-backed connections versus local endpoints, per-resource
credential behavior, unauthenticated Redis limitation, secret exposure
boundaries, and actionable runtime diagnostics 070–091. Wire navigation
and exact package mapping. Source: microsoft/aspire#19555 and release
README.
- [x] **12. Connection aliases:** replace contradictory no-encoding
guidance, retain composed logical-key-first lookup and portable-target
behavior, explain collision detection and custom-publisher metadata.
Source: microsoft/aspire#19729.
- [x] **13. Connector Namespace / Toolbox / provisioning:** add
Connector Namespace walkthrough, security/consent/revocation limits and
mapping/sidebar; add Foundry Toolbox walkthrough, connection properties,
roles, index prerequisites, approval enforcement boundaries, immutable
versions, and existing-resource behavior. Extend existing Azure
provisioning guide without a duplicate page. Sources:
microsoft/aspire#19024, microsoft/aspire#17742, microsoft/aspire#20131.
- [x] **14. Remaining high-impact items:** article covers opt-in
manifest-aware DNX and new-template CLI bundling (existing SDK guides
retained), migration skill and Copilot app detection; canonical inline
`CsiVolumeSourceV1`/`VolumeV1.Csi` example, management links, Cosmos
vNext telemetry, and AI Inference `GetModelInfoAsync`/`/info` health
checks with `DisableHealthChecks`. No Azure OpenAI health-check claim.
Sources: microsoft/aspire#19310, microsoft/aspire#19076,
microsoft/aspire#19826, microsoft/aspire#20070, microsoft/aspire#15671,
microsoft/aspire#15969.
- [x] **15. All 25 proposal dispositions:** listed below, including
newer dashboard backports and four exclusions. Existing Sandbox
inference coverage is retained rather than copied from a stale draft.
- [ ] **16. Refresh generated API/catalog/Twoslash data from an official
post-backport 13.6 build.** Existing `26473.12`/`a11eca96` data remains
untouched. The newest public `dotnet9` feed package checked,
`13.6.0-preview.1.26474.10` at
`43496a2a306c81c862c947b11b4f4e5494b6fe08`, still has no Redis
`WithRepl` in its actual package XML. Do not use 14.x, hand-edit
declarations, or attribute source changes to older binaries.
- [ ] **Validate the six REPL examples against that actual post-backport
SDK and running clients.** Their new TypeScript fences are plain
TypeScript, not annotated with unsupported Twoslash data. No existing
diagnostics are allowlisted or suppressed; no generated API exports are
fabricated. Enable Twoslash when the genuine catalog catches up.

### All 25 open proposal dispositions and provenance

Text is selectively adapted from these proposals, not merged wholesale.
#1778 and #1748 are authored by @sebastienros; the other proposals are
authored by the Aspire repo bot. The table credits the associated
product-change authors where supplied by the proposals. Existing PRs
remain open and unchanged.

| Docs PR | Release source / credited product author | Disposition |
| --- | --- | --- |
| #1778 | microsoft/aspire#19729 — @sebastienros | **Adopted:**
canonical connection-string alias correction, including logical-first
resolution and migration. |
| #1771 | microsoft/aspire#20481 — @sebastienros | **Excluded:** flat
polyglot feature keys are not in the audited release tip; no verified
backport. Preserve release key names. |
| #1770 | microsoft/aspire#20525 → microsoft/aspire#20548 — @mitchdenny
| **Corrected/adopted:** command guides plus the still-current 13.6
article, which the proposal incorrectly treats as historical. |
| #1769 | microsoft/aspire#20416 — @JamesNK | **Excluded:** brand hover
change has no verified 13.6 membership/backport. |
| #1768 | microsoft/aspire#20523 → microsoft/aspire#20546 — @JamesNK |
**Adopted:** run pin/unpin preserves selector and current selection. |
| #1766 | microsoft/aspire#20537 → microsoft/aspire#20541 — @mitchdenny
| **Adopted:** terminal dock empty state. |
| #1761 | microsoft/aspire#20490 → microsoft/aspire#20496 — @eerhardt |
**Corrected:** graduation is 13.6, package remains prerelease,
Blazor-specific exception retained. |
| #1760 | microsoft/aspire#20436 — @eerhardt | **Excluded:** CLI
net11/tools-any retarget is not in the audited release; no fallback-base
inference. |
| #1748 | microsoft/aspire#20131 — @sebastienros | **Adopted:** extend
existing provisioning guide with service-specific models/lookups and
projection limits. |
| #1744 | microsoft/aspire#20337 → microsoft/aspire#20441 — @karolz-ms |
**Adopted:** precise SDK-conditional multithreaded build coverage. |
| #1740 | microsoft/aspire#20231 → microsoft/aspire#20419 — @mitchdenny
| **Adapted:** all six guides; TypeScript-first tabs, source-verified
lifecycle/security. Actual post-backport SDK/runtime gate is open above.
|
| #1738 | microsoft/aspire#20158 → microsoft/aspire#20405 — @karolz-ms |
**Partly already covered / completed:** existing seven-skill catalog
retained; add project migration guidance and correct command
catalog/defaults. Do not misclassify the bundled skill as a companion
tool. |
| #1735 | microsoft/aspire#20334 — @karolz-ms | **Excluded:** enhanced
startup errors are not in the audited release; no verified backport. |
| #1731 | microsoft/aspire#19847 → microsoft/aspire#20391 — @eerhardt |
**Corrected/adopted:** in-process NuGet and real authenticated-restore
troubleshooting, not cache-command authentication. |
| #1719 | microsoft/aspire#20299 → microsoft/aspire#20407 — @JamesNK |
**Corrected/adopted:** cookie naming/scoping; identical names can
collide but do not guarantee cross-dashboard cookie decryptability or
shared sign-in. |
| #1664 | microsoft/aspire#20011 — @maddymontaquila | **Adopted:**
concise Azure environment icon release note. |
| #1628 | microsoft/aspire#17742 — @davidfowl | **Adapted/expanded:**
canonical Toolbox examples, consumer contract, role/index prerequisites,
approval/security and concurrency limits. |
| #1623 | microsoft/aspire#19810 — @mitchdenny | **Already covered:**
current Sandbox guide/article already describe compute inference,
explicit selection and external endpoints. Preserve that guidance while
removing obsolete suppressions. |
| #1620 | microsoft/aspire#19243 — @sebastienros | **Adapted:** AKS
credential-before-Helm cleanup and destructive-operation warning; omit
misleading ambient-context workaround. |
| #1614 | microsoft/aspire#19870 — @sebastienros | **Adopted:** typed
callback handle behavior in extension authoring and article. |
| #1574 | microsoft/aspire#19430 — @mitchdenny | **Adapted:** canonical
hostname inheritance, explicit-host precedence, catch-all default
backend. |
| #1570 | microsoft/aspire#19590 — @karolz-ms | **Adopted:** Dev Tunnel
URL regression troubleshooting. |
| #1565 | microsoft/aspire#19429 — @mitchdenny | **Corrected/adopted:**
Helm embedded parameters with real `refExpr` and `addParameter(name, {
value })`, not stringifying a handle or using an invalid actual-SDK
overload. |
| #1564 | microsoft/aspire#19026 — @karolz-ms | **Corrected/adopted:**
C#/TypeScript Dotnet gateway walkthrough. Retain both experimental
diagnostics; remove obsolete run-only restriction after
microsoft/aspire#19997 publishing support. Avoid imported ambiguous API
reference. |
| #1499 | microsoft/aspire#19248 — @IEvangelist | **Adopted:** describe
exact secret-value redaction and embedded-secret limit; release article
already covered the fix. |

### Important source-verified corrections to proposals / earlier audit
assumptions

-
[`BlazorGatewayExtensions.cs`](https://github.com/microsoft/aspire/blob/e8fd6fbb954f50ccd2e66479538392f65e13e71d/src/Aspire.Hosting.Blazor/BlazorGatewayExtensions.cs):
`AddDotnetProjectBlazorGateway` and the Dotnet `WithBlazorClientApp`
overload still carry `ASPIREDOTNETPROJECT001`; the class carries
`ASPIREBLAZOR001`. They share `WithBlazorClientAppCore`/`WithBlazorApp`
and the publish-companion path. Thus neither blanket diagnostic
retirement nor the proposal's old run-only claim is correct.
-
[`SkillDefinition.cs`](https://github.com/microsoft/aspire/blob/e8fd6fbb954f50ccd2e66479538392f65e13e71d/src/Aspire.Cli/Agents/SkillDefinition.cs)
sets bundled skills' `IsDefault=true`;
[`AgentInitCommand.cs`](https://github.com/microsoft/aspire/blob/e8fd6fbb954f50ccd2e66479538392f65e13e71d/src/Aspire.Cli/Commands/AgentInitCommand.cs)
selects the applicable catalog defaults for both flows. MCP has its own
standalone-only binding.
-
[`TypeScriptAppHostToolchainResolver.cs`](https://github.com/microsoft/aspire/blob/e8fd6fbb954f50ccd2e66479538392f65e13e71d/src/Aspire.Cli/Projects/TypeScriptAppHostToolchainResolver.cs)
is the source for Deno flags and certificate variable; guest Deno
hosting is separate.
- [`Radius
README`](https://github.com/microsoft/aspire/blob/e8fd6fbb954f50ccd2e66479538392f65e13e71d/src/Aspire.Hosting.Radius/README.md)
supplies the resource-specific credential rules and publish diagnostics,
not assumptions about local endpoints.

## Third-party links and affiliations

<!-- List third-party links and disclose material affiliations. -->

Links point to official Microsoft Learn, VS Code Marketplace debugger
extensions, Rust/Cargo/Bacon documentation, Radius documentation, and
source repositories. No sponsorship, commercial endorsement, or
affiliation claim is introduced. Maintainers should supply any personal
affiliation disclosure required by policy; automation has not inferred
one.

## Validation

<!-- List the checks you ran or explain why validation isn't needed. -->

- **97 passing focused unit checks** across API-reference
authoring/rendering, Twoslash blocks, file-tree formatting, CLI
configuration schema, SEO lengths, and resource catalog.
- **82 passing structured-data checks**, including exact integration
mapping uniqueness and page resolution.
- **11 C# samples compile**, zero warnings/errors, using genuine
`13.6.0-preview.1.26473.12` packages. Scope: Rust, Connector Namespace,
Radius, Toolbox, inline CSI, Helm, Blazor gateway, and provisioning.
`Projects.Api/Worker/Client` use compile-only `IProjectMetadata`
stand-ins; no claim of running those apps or provisioning cloud
resources.
- **10 TypeScript samples pass `tsc`** under `strict`, `NodeNext`, and
`ES2022` against three **unmodified actual SDK files**, not just the
site's declaration bundle. The fixture uses the exact `e8fd6fbb` release
`AtsCapabilityScanner` and genuine `26473.12`
TypeSystem/code-generator/integration binaries, whose informational
source is `a11eca96`. This is an isolated local generation fixture,
**not** a claim that official CLI generation or a new packaged release
was tested. An attempted restore with the older handed-off local CLI
could not discover an AppHost server; the bounded direct generator
fixture was used instead.
- The SDK scan is **not globally warning-free**: it reports a Radius
`withContainerImage` collision on `CSharpAppResource` and an App
Configuration `createRoleAssignment` overload collision. None of the
compiled examples calls those colliding methods; the warnings are
retained in evidence, not suppressed, and no generated declarations were
edited.
- Browser: Connector Namespace, Radius, both Rust pages, Foundry
hosting, and What's new return **HTTP 200**, correct headings, and no
rendered Twoslash errors. New guide/article page-local anchors and the
cross-page Blazor anchor resolve. Connector/Radius mobile layouts have
no horizontal overflow; Connector language-tab interaction works.
Standalone Astro preview emits expected `/api/live` 404s because
StaticHost is not running.
- `git diff --check` passes. No production `pnpm build`, cloud
deployment, REPL runtime session, full product suite, or blanket
validation of every pre-existing example was performed.
- Generated C#/TypeScript API data, declaration bundles, integration
catalogs, image catalogs, and contributor data are unchanged. Only the
authored package-to-guide mapping is updated.

**Before merging:** complete the two packaging/REPL checkboxes above,
inspect CI, and obtain human review. This PR intentionally does not
close or merge the source documentation proposals.

---------

Co-authored-by: David Pine <7679720+IEvangelist@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 3, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants