Skip to content

Add docked REPL commands for database and cache integrations - #20231

Merged
Mitch Denny (mitchdenny) merged 5 commits into
mainfrom
mitchdenny-postgres-and-redis-repl
Sep 24, 2026
Merged

Mitch Denny (mitchdenny) merged 5 commits into
mainfrom
mitchdenny-postgres-and-redis-repl

Conversation

@mitchdenny

@mitchdenny Mitch Denny (mitchdenny) commented Sep 18, 2026 •

Copy link
Copy Markdown
Member

Description

Make it possible to query local databases and caches directly from the Aspire dashboard without installing clients or copying credentials into a separate terminal.

Adds an explicitly opt-in REPL resource command for PostgreSQL, Redis, Valkey, MongoDB, MySQL, and SQL Server. Each integration exposes a typed WithRepl() extension. The command opens the bundled client (psql, redis-cli, valkey-cli, mongosh, mysql, or sqlcmd) in the dashboard terminal dock, already authenticated to the running container. Sessions remain available after the command returns.

Shared internal source resolves the current container ID, respects Docker/Podman runtime selection, and disables the command until the container is running and its ID is available. Commands are run-mode-only and are not registered unless explicitly enabled. Adds all six resources to the terminal playground and documents the experience in each integration README. No shared public REPL interface or terminal lifecycle API is introduced.

User-facing usage

Enable the command only for resources whose authenticated client access is appropriate for everyone who can access the dashboard:

builder.AddPostgres("postgres").WithRepl();
builder.AddRedis("redis").WithRepl();
builder.AddValkey("valkey").WithRepl();
builder.AddMongoDB("mongo").WithRepl();
builder.AddMySql("mysql").WithRepl();
builder.AddSqlServer("sqlserver").WithRepl();

The same opt-in is available to TypeScript AppHosts:

await builder.addPostgres("postgres").withRepl();
await builder.addRedis("redis").withRepl();
await builder.addValkey("valkey").withRepl();
await builder.addMongoDB("mongo").withRepl();
await builder.addMySql("mysql").withRepl();
await builder.addSqlServer("sqlserver").withRepl();

Run the AppHost and select REPL on a running resource. PostgreSQL starts in postgres; SQL Server starts in master. MongoDB supports direct replica-member connections and uses the configured CA bundle without disabling TLS validation. SQL Server supports current and legacy bundled sqlcmd locations. PostgreSQL and MySQL respect customized container target ports.

Quit the client before closing its terminal tab. Closing the tab alone may leave the client running inside the container; stopping the container ends remaining clients.

Validation

  • All 135 focused REPL tests passed locally across the six integrations, including authenticated queries or commands through real docked terminals.
  • Coverage includes default-off and run/publish behavior, null validation, command state and cancellation, credential forwarding, custom target ports, MongoDB TLS/replica-set behavior, Redis TLS loopback routing, and SQL Server interactive GO batches.
  • Readiness and terminal interactions have independent timeout budgets, with terminal-screen diagnostics on interaction timeout.
  • Terminal playground builds with all six integrations, with dashboard/terminal-host project builds and native compilation skipped.
  • Generated TypeScript APIs were checked for all six withRepl() exports.
  • Published-artifact testing at 392e1d1877 passed on macOS ARM64/Docker using five freshly generated AppHosts: C# and TypeScript default-off/opt-in behavior, all six authenticated dashboard clients, normal exit/reopen, custom ports, Redis/MongoDB variants, stopped-command disabling, container replacement, stale-credential failure, and publish-mode exclusion. Captured 21 screenshots and CLI/browser logs.
  • CI run https://github.com/microsoft/aspire/actions/runs/35421647744 completed successfully. Podman runtime behavior has not been independently validated.

Security considerations

REPL commands are disabled by default. Enabling one grants dashboard users access to a privileged, authenticated database/cache client, potentially including server-side operating-system commands. Only enable this for trusted dashboard users; consider tunnels, Codespaces, and VS Code remoting when deciding who can access it. SQL Server uses the sa account.

Passwords are forwarded through environment variables rather than command-line arguments. MongoDB retains certificate validation; SQL Server trusts the local server certificate for its in-container loopback connection. Redis uses its existing non-TLS loopback port when TLS is enabled. Review should consider credential exposure through process environments, shell/client launch handling, and access to authenticated terminal sessions. No formal threat model or security review has been completed.

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>
Copilot-Session: b4c5fc2e-7805-44de-b46c-7d59e732ccf7
@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 -- 20231

Or

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

@aspire-repo-bot
aspire-repo-bot Bot requested a balanced review from Copilot September 18, 2026 09:46
@github-actions github-actions Bot added the area-integrations Issues pertaining to Aspire Integrations packages label Sep 18, 2026
@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.

Copilot review overview

🔵 Needs a closer look

The privileged terminal feature lacks a security review, and the shared functional-test timeout introduces a CI flakiness risk.

Review effort: Balanced
Findings: 1 Medium severity

Open (1)
What changed in this PR

Adds authenticated, docked database/cache REPL commands to six container integrations.

Changes:

  • Adds shared run-only container REPL command plumbing.
  • Implements client-specific launch options and integration tests.
  • Documents and showcases the commands in the terminal playground.
File Description
src/​Shared/​ContainerReplCommand.cs Adds shared REPL command execution.
src/​Aspire.Hosting.Valkey/​ValkeyBuilderExtensions.cs Configures valkey-cli.
src/​Aspire.Hosting.Valkey/​README.md Documents Valkey REPL usage.
src/​Aspire.Hosting.Valkey/​Aspire.Hosting.Valkey.csproj Includes shared REPL code.
src/​Aspire.Hosting.SqlServer/​SqlServerBuilderExtensions.cs Configures compatible sqlcmd launch.
src/​Aspire.Hosting.SqlServer/​README.md Documents SQL Server REPL usage.
src/​Aspire.Hosting.SqlServer/​Aspire.Hosting.SqlServer.csproj Includes shared REPL code.
src/​Aspire.Hosting.Redis/​RedisBuilderExtensions.cs Configures TLS-aware redis-cli.
src/​Aspire.Hosting.Redis/​README.md Documents Redis REPL usage.
src/​Aspire.Hosting.Redis/​Aspire.Hosting.Redis.csproj Includes shared REPL code.
src/​Aspire.Hosting.PostgreSQL/​PostgresBuilderExtensions.cs Configures authenticated psql.
src/​Aspire.Hosting.PostgreSQL/​README.md Documents PostgreSQL REPL usage.
src/​Aspire.Hosting.PostgreSQL/​Aspire.Hosting.PostgreSQL.csproj Includes shared REPL code.
src/​Aspire.Hosting.MySql/​MySqlBuilderExtensions.cs Configures authenticated MySQL client.
src/​Aspire.Hosting.MySql/​README.md Documents MySQL REPL usage.
src/​Aspire.Hosting.MySql/​Aspire.Hosting.MySql.csproj Includes shared REPL code.
src/​Aspire.Hosting.MongoDB/​MongoDBBuilderExtensions.cs Configures TLS-aware mongosh.
src/​Aspire.Hosting.MongoDB/​README.md Documents MongoDB REPL usage.
src/​Aspire.Hosting.MongoDB/​Aspire.Hosting.MongoDB.csproj Includes shared REPL code.
tests/​Shared/​ContainerReplCommandTestBase.cs Adds shared command and terminal tests.
tests/​Aspire.Hosting.TestUtilities/​Utils/​TerminalCommandTestHelpers.cs Adds dock-terminal test helper.
tests/​Aspire.Hosting.Valkey.Tests/​ValkeyReplCommandTests.cs Tests Valkey REPL behavior.
tests/​Aspire.Hosting.Valkey.Tests/​Aspire.Hosting.Valkey.Tests.csproj Links shared REPL tests.
tests/​Aspire.Hosting.SqlServer.Tests/​SqlServerReplCommandTests.cs Tests SQL Server REPL behavior.
tests/​Aspire.Hosting.SqlServer.Tests/​Aspire.Hosting.SqlServer.Tests.csproj Links shared REPL tests.
tests/​Aspire.Hosting.Redis.Tests/​RedisReplCommandTests.cs Tests Redis REPL behavior.
tests/​Aspire.Hosting.Redis.Tests/​Aspire.Hosting.Redis.Tests.csproj Links shared REPL tests.
tests/​Aspire.Hosting.PostgreSQL.Tests/​PostgresReplCommandTests.cs Tests PostgreSQL REPL behavior.
tests/​Aspire.Hosting.PostgreSQL.Tests/​Aspire.Hosting.PostgreSQL.Tests.csproj Links shared REPL tests.
tests/​Aspire.Hosting.MySql.Tests/​MySqlReplCommandTests.cs Tests MySQL REPL behavior.
tests/​Aspire.Hosting.MySql.Tests/​Aspire.Hosting.MySql.Tests.csproj Links shared REPL tests.
tests/​Aspire.Hosting.MongoDB.Tests/​MongoDBReplCommandTests.cs Tests MongoDB authentication and TLS.
tests/​Aspire.Hosting.MongoDB.Tests/​Aspire.Hosting.MongoDB.Tests.csproj Links shared REPL tests.
playground/​Terminals/​Terminals.AppHost/​AppHost.cs Adds six REPL-enabled resources.
playground/​Terminals/​Terminals.AppHost/​Terminals.AppHost.csproj References their integrations.

@github-actions

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.

@github-actions

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: b4c5fc2e-7805-44de-b46c-7d59e732ccf7
@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.

Copilot review overview

🔵 Needs a closer look

It introduces privileged authenticated terminal sessions and credential forwarding without a completed security review.

Review effort: Balanced
Findings: 1 Medium severity

Open (1)

@mitchdenny

Copy link
Copy Markdown
Member Author

PR Testing Report

PR Information

  • PR: Add docked REPL commands for database and cache integrations #20231 - Add docked REPL commands for database and cache integrations
  • Head commit: 1095b4ac6abda3bb6ad4714480be37e7898e20de
  • Tested: 2026-09-18
  • Environment: macOS ARM64, Docker, Microsoft Edge driven through Playwright CLI
  • Execution: Four freshly generated C# file-based AppHosts outside the repository

Artifact Version Verification

The initial install correctly failed because the current-head native CLI artifact had not yet been uploaded. Testing waited for the package and macOS ARM64 CLI jobs to succeed, then installed their artifacts. No older build was substituted.

Changes Analyzed

Hosting changes add a shared container-exec command and integration-specific client arguments, authentication, and TLS handling:

  • src/Shared/ContainerReplCommand.cs
  • src/Aspire.Hosting.PostgreSQL/PostgresBuilderExtensions.cs
  • src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs
  • src/Aspire.Hosting.Valkey/ValkeyBuilderExtensions.cs
  • src/Aspire.Hosting.MongoDB/MongoDBBuilderExtensions.cs
  • src/Aspire.Hosting.MySql/MySqlBuilderExtensions.cs
  • src/Aspire.Hosting.SqlServer/SqlServerBuilderExtensions.cs
  • Corresponding integration project files and READMEs
  • playground/Terminals/Terminals.AppHost/AppHost.cs and its project references
  • Six integration REPL test classes and their project references
  • tests/Shared/ContainerReplCommandTestBase.cs
  • tests/Aspire.Hosting.TestUtilities/Utils/TerminalCommandTestHelpers.cs

There are no CLI, dashboard-source, template, client-component, VS Code extension, or CI-infrastructure changes. Dashboard testing below exercises the new hosting commands through the existing terminal UI.

Test Scenarios Executed

1. Default authenticated REPLs

Coverage: Happy path
Status: Passed

Created ReplHappy using aspire new aspire-empty, added all six integrations from the PR packages, and started it with aspire start --isolated. All six containers became healthy.

For each resource, clicked Actions > REPL in the actual dashboard, entered commands through the terminal textbox, and verified the rendered terminal screen using the dashboard's getTerminalSnapshot diagnostic API. Each session appeared in the bottom terminal dock.

Resource Command Observed result
PostgreSQL SELECT current_user, current_setting('port'); postgres, 5432
Redis PING PONG
Valkey PING PONG
MongoDB Read authenticated user through connectionStatus admin-authenticated
MySQL SELECT CURRENT_USER(), @@port; root@%, 3306
SQL Server SELECT 'repl-' + SUSER_SNAME(); followed by GO repl-sa, one row

The Redis resource had TLS enabled; its REPL correctly used the internal plaintext secondary endpoint at port 6380. SQL Server was tested using 2022-latest under Docker's AMD64 emulation on the ARM64 host.

Evidence: pr-testing-happy-browser.log, pr-testing-happy-resources.json, and repl-{postgres,redis,valkey,mongo,mysql,sqlserver}.png.

2. Non-default internal ports

Coverage: Boundary/regression
Status: Passed

Created a separate ReplPorts app with:

builder.AddPostgres("postgres", password: password)
    .WithArgs("-p", "5433")
    .WithEndpoint("tcp", endpoint => endpoint.TargetPort = 5433);
builder.AddMySql("mysql", password: password)
    .WithArgs("--port=3307")
    .WithEndpoint("tcp", endpoint => endpoint.TargetPort = 3307);

Invoked both REPLs from the dashboard. PostgreSQL returned its actual server port as 5433; MySQL returned 3307. Both authenticated successfully. This verifies the latest port fixes against packaged PR artifacts, not only against source-level tests.

Evidence: pr-testing-ports-browser.log, ReplPorts-postgres.png, ReplPorts-mysql.png.

3. Authentication and TLS variants

Coverage: Happy path/boundary
Status: Passed

Created ReplVariants with four resources. All became healthy, and all REPLs were opened from the dashboard.

Variant Observed result
Passwordless Redis, TLS disabled PING returned PONG through port 6379
Redis with developer-certificate TLS PING returned PONG through internal secondary port 6380
MongoDB with TLS and a custom certificate directory Authenticated as admin; REPL query succeeded
MongoDB single-member replica set Prompt showed [direct: primary]; db.hello().setName returned mongo-replica

MongoDB's custom certificate directory was /usr/local/share/aspire-repl-ca. The fixture explicitly opted into the existing experimental certificate and replica-set APIs.

Evidence: pr-testing-variants-browser.log, pr-testing-variants-resources.json, and four ReplVariants-*.png screenshots.

4. Dock tab closure and reopening

Coverage: Lifecycle
Status: Failed cleanup; reopening passed

Created ReplLifecycle with PostgreSQL. Opened its REPL, closed the tab through the dashboard close button, and confirmed the tab disappeared. Opened a new REPL and successfully executed a query returning reopened-postgres.

Issue found: Closing the tab did not terminate the remote psql process or its database connection. After opening and closing two sessions, no terminal tabs remained, but docker top showed two psql processes and two corresponding idle local PostgreSQL connections:

482750  psql      /usr/lib/postgresql/18/bin/psql --username postgres --dbname postgres --no-password --port 5432
482756  postgres  postgres: postgres postgres [local] idle
483100  psql      /usr/lib/postgresql/18/bin/psql --username postgres --dbname postgres --no-password --port 5432
483107  postgres  postgres: postgres postgres [local] idle

The same behavior was reproduced after replacing the container: closing the later live REPL again left a remote psql process and idle database connection behind. A screenshot and DOM snapshot confirmed there were zero docked terminals.

Impact: Repeated open/close cycles accumulate client processes and database connections until the container is stopped. Tab removal alone is not sufficient cleanup for these container-exec sessions.

Recommendation: Investigate and fix remote exec-process lifetime on terminal disposal, then add a regression that verifies the in-container client and database connection disappear after closing the tab. The observed failure is in the new end-to-end REPL workflow; this testing pass did not isolate whether the correction belongs in the command helper, shared terminal lifetime handling, or container-runtime handling.

Evidence: pr-testing-closed-terminal-processes.log, pr-testing-close-browser.log, pr-testing-reopened.log, repl-reopened.png, repl-all-tabs-closed.png.

5. Container replacement

Coverage: Lifecycle/boundary
Status: Passed

Stopped and started PostgreSQL through the PR CLI and waited for it to become healthy. The container ID changed from 5ef829c8fd8d... to a84aa0c265ea.... A newly opened dashboard REPL authenticated against the replacement and returned restarted-postgres.

Evidence: pr-testing-lifecycle-before.json, pr-testing-lifecycle-after.json, pr-testing-restart-browser.log, repl-restarted.png.

6. Stopped-resource command state

Coverage: Unhappy path
Status: Passed

Stopped PostgreSQL and confirmed its resource state was Exited. Opened its dashboard action menu and verified the REPL Fluent menu item's disabled property was true.

Expected outcome: The stopped resource must not offer an actionable REPL command.

Evidence: pr-testing-lifecycle-stopped.json, pr-testing-stopped-browser.log, repl-stopped-disabled.png.

7. Stale credentials

Coverage: Unhappy path
Status: Passed

Changed the temporary database's password inside an authenticated REPL using \password, leaving the AppHost's parameter unchanged. Opened another REPL through the dashboard.

The new session visibly reported:

FATAL: password authentication failed for user "postgres"

The terminal then reported ended: true and readOnly: true; it did not appear to be a usable authenticated session.

Expected outcome: A visible authentication failure and an ended session, not silent success.

Evidence: pr-testing-stale-credentials.log, repl-stale-credentials.png.

8. Publish-mode exclusion

Coverage: Boundary/model validation
Status: Passed

Ran the fresh lifecycle fixture using:

aspire publish --apphost ReplLifecycle/apphost.cs --list-steps --non-interactive --log-level Debug

In publish mode, the fixture registered all six integrations and asserted that each had zero ResourceCommandAnnotation entries named repl. The process exited successfully and logged:

PUBLISH_REPL_COUNT postgres=0
PUBLISH_REPL_COUNT redis=0
PUBLISH_REPL_COUNT valkey=0
PUBLISH_REPL_COUNT mongo=0
PUBLISH_REPL_COUNT mysql=0
PUBLISH_REPL_COUNT sqlserver=0

This validates publish-mode command registration. It does not claim to validate a deployment.

Evidence: pr-testing-publish.log, pr-testing-publish-counts.log.

Test Harness Notes and Limits

  • Browser automation was corrected to use synchronous waitForFunction predicates. In this installed browser automation stack, an asynchronous predicate returned immediately even when it resolved to false; those preliminary attempts were not counted as successful tests.
  • The initial shared-canvas run had competing browser connections/input. The AppHost was restarted at a fresh isolated dashboard URL, and the successful default-resource run used only the dedicated automation browser.
  • The browser harness waits for the resource page title, a newly created terminal, and actual prompt/output text before proceeding. It reads the Fluent component's actual disabled property rather than assuming an aria-disabled attribute.
  • Default Chrome was unavailable; the installed Microsoft Edge browser was used instead.
  • Podman, Windows, Linux hosts, and the legacy SQL Server tools path were not tested in this artifact-based run.
  • No production source or repository files were changed during this testing pass.

Summary

Scenario Result
All six default docked REPLs Passed
PostgreSQL 5433 / MySQL 3307 Passed
Passwordless Redis and TLS/replica-set variants Passed
Dock tab closure and reopening Failed remote-process cleanup; reopening passed
Container replacement Passed
Stopped-resource REPL disabled Passed
Stale-password failure surfaced Passed
Publish-mode REPL exclusion Passed

Overall Result

ISSUES FOUND: One reproducible lifecycle cleanup problem. The authenticated REPLs, custom-port fixes, connection variants, restart behavior, negative states, and publish-mode exclusion otherwise passed the exercised scenarios.

Evidence and Cleanup

Evidence is retained under:

/Users/midenn/.copilot/session-state/b4c5fc2e-7805-44de-b46c-7d59e732ccf7/files/

The report, browser output logs, screenshots, publish counts, and pr-testing-repro-apps.tar.gz are retained there. The archive contains the four AppHost source files and the browser scenario scripts, not the downloaded CLI/package cache.

All test AppHosts and the dedicated browser session have been stopped. The lifecycle test containers were confirmed removed, taking the orphaned REPL processes with them. The temporary CLI/package/app workspace has been deleted; the evidence listed above remains available.

PR comment: Posting approved by the user.

@github-actions

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.

@github-actions

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.

@github-actions

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.

Add typed WithRepl exports and trusted-dashboard guidance for all six integrations. Keep direct runtime exec behavior and isolate readiness and terminal test timeout budgets.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b4c5fc2e-7805-44de-b46c-7d59e732ccf7
@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.

Copilot review overview

🔵 Needs a closer look

It introduces privileged authenticated terminal access across six integrations without a completed threat model or security review.

Review effort: Balanced
Findings: None

Resolved since last review (1)
Previously missed (1)

In code that hasn't changed since last review

Low severity Correct dashboard description for passwordless resource paths

src/​Shared/​ContainerReplCommand.cs:59

This dashboard description is inaccurate for the supported passwordless Redis, Valkey, and MongoDB resource paths: those REPLs open without authentication. Avoid promising authentication in the shared text.

@mitchdenny

Copy link
Copy Markdown
Member Author

PR Testing Report

PR information

  • PR: Add docked REPL commands for database and cache integrations #20231 — Add docked REPL commands for database and cache integrations
  • Head tested: 392e1d1877087b9e1d95ad3f11207deb7c2f432d
  • Tested: 2026-09-19
  • Environment: macOS ARM64, Docker 29.4.3, Microsoft Edge controlled by Playwright CLI
  • Scope: Five freshly generated temporary AppHosts using published PR artifacts, not repository project references

Artifact version verification

  • Expected commit: 392e1d1877087b9e1d95ad3f11207deb7c2f432d
  • Installed CLI: 13.6.0-pr.20231.g392e1d18
  • SDK and integration packages: Explicitly pinned to 13.6.0-pr.20231.g392e1d18 from the downloaded PR hive
  • Artifact run: https://github.com/microsoft/aspire/actions/runs/35421647744
  • Status: Verified. The PR head was checked again after testing and remained unchanged.
  • CI: The run completed successfully, including package and macOS ARM64 CLI artifact jobs.

The isolated dogfood install used the installer linked in the PR comment. Its reported executable location was install/dogfood/pr-20231/bin/aspire; that exact executable was used throughout. The install completed successfully. No older artifact or source-build substitution was used.

Changes analyzed

The 35-file change spans:

  • src/Shared/ContainerReplCommand.cs: shared internal container-runtime exec command.
  • Six hosting integrations: PostgreSQL, Redis, Valkey, MongoDB, MySQL, and SQL Server; typed WithRepl() APIs, client arguments, authentication, and TLS handling.
  • The six integration project files and READMEs.
  • playground/Terminals/Terminals.AppHost/: explicit opt-in examples and references.
  • Six integration REPL test classes and their project references.
  • tests/Shared/ContainerReplCommandTestBase.cs: opt-in/run-mode coverage and independent readiness/interaction timeout budgets.
  • tests/Aspire.Hosting.TestUtilities/Utils/TerminalCommandTestHelpers.cs.

Hosting and test changes are present. There are no CLI, dashboard implementation, template, client-component, VS Code extension, or CI-infrastructure changes. Browser tests exercise the new integration commands through the existing dashboard UI.

Executed scenarios

1. C# explicit opt-in and authenticated docked clients

Coverage: Happy path and default-off boundary. Result: Passed.

Created ReplOptIn with aspire new aspire-empty using the verified PR template/hive. Added all six integrations with .WithRepl() and six corresponding resources without opt-in. The default-off resources used explicit startup to avoid launching unnecessary duplicate containers.

The AppHost asserts the actual model contains exactly one repl command per opted-in resource and none on each default-off resource. The dashboard action menus independently confirmed all six default-off resources have no REPL command.

Opened every opted-in client through Actions > REPL, verified its terminal appeared in the bottom dock, executed an authenticated query, and exited using the client's normal quit command. Repeated the full matrix to verify reopening.

Integration Query Observed result Normal exit
PostgreSQL SELECT current_user, current_setting('port'); postgres, 5432 \q
Redis PING PONG quit
Valkey PING PONG quit
MongoDB Read authenticated user via connectionStatus admin-authenticated exit
MySQL SELECT CURRENT_USER(), @@port; Root account, 3306 exit
SQL Server SELECT 'repl-' + SUSER_SNAME(); followed by GO repl-sa EXIT

All 12 query/normal-exit cycles passed. Terminal diagnostic snapshots confirmed ended sessions after normal exit.

Evidence: optin-browser.log, optin-resources.json, six ReplOptIn-*.png screenshots.

2. TypeScript explicit opt-in and runtime execution

Coverage: Happy path, polyglot projection, default-off boundary. Result: Passed.

Created a separate ReplTypeScript app using aspire new aspire-ts-empty. Added all six integrations using aspire add, explicitly specifying the PR package version and hive. The SDK and all six package entries were verified at the tested version.

Ran actual .withRepl() calls for all six types, rather than only inspecting generated declarations. Added six default-off resources, checked their dashboard menus have no REPL command, then performed the same two rounds of authenticated queries and normal exits as the C# fixture.

All six default-off checks and all 12 authenticated query/normal-exit cycles passed.

Evidence: ts-add-*.log, ts-browser.log, ts-resources.json, six ReplTypeScript-*.png screenshots, archived AppHost configuration.

3. Customized container target ports

Coverage: Boundary/regression. Result: Passed.

Created ReplPorts with PostgreSQL configured to listen on port 5433 and MySQL on port 3307, including matching target endpoint ports. Enabled .WithRepl() on both.

Dashboard-launched clients authenticated successfully and reported the actual server ports as 5433 and 3307. Both clients also reopened and exited normally. Four query/exit cycles passed.

Evidence: ports-browser.log, ports-resources.json, ReplPorts-postgres.png, ReplPorts-mysql.png.

4. Redis and MongoDB variants

Coverage: Happy path/boundary. Result: Passed.

Created ReplVariants with:

Variant Verified behavior
Passwordless Redis without TLS PING returned PONG via port 6379
Redis with developer-certificate TLS PING returned PONG through the internal plaintext loopback endpoint at port 6380
MongoDB with TLS and custom certificate directory Client authenticated as admin using /usr/local/share/aspire-repl-ca
MongoDB single-member replica set Direct primary connection returned the expected replica-set name

All four clients were exercised twice and exited normally: eight query/exit cycles passed.

Evidence: variants-browser.log, variants-resources.json, four ReplVariants-*.png screenshots.

5. Stopped-resource command state

Coverage: Unhappy path. Result: Passed.

Created ReplLifecycle, started PostgreSQL, then stopped it using aspire resource postgres stop. Waited for the down state and opened its dashboard action menu.

Expected and observed: The REPL menu item's actual Fluent disabled property was true; the stopped resource did not offer an actionable REPL.

Evidence: lifecycle-stopped.json, stopped-browser.log, stopped-disabled.png.

6. Container replacement

Coverage: Lifecycle/boundary. Result: Passed.

Restarted PostgreSQL through the CLI and waited for health. Verified the container ID changed from 64b6f2fdb3e9... to 242b06a89f54....

A newly opened dashboard REPL authenticated against the replacement and returned restarted-postgres.

Evidence: lifecycle-before.json, lifecycle-after.json, lifecycle-browser.log, restarted.png.

7. Stale credentials

Coverage: Unhappy path. Result: Passed.

The lifecycle fixture required password authentication for local PostgreSQL connections. Changed the disposable database's password inside its authenticated REPL using \password, left the AppHost parameter unchanged, quit normally, and opened another REPL.

Expected and observed: The new terminal visibly reported FATAL: password authentication failed for user "postgres". Its diagnostic state was ended: true and readOnly: true, rather than a usable session.

Evidence: auth-failure-browser.log, auth-failure.png.

8. Publish-mode exclusion

Coverage: Boundary/model validation. Result: Passed.

Ran aspire publish --list-steps --non-interactive against the C# fixture. Its model assertions require zero REPL commands on all resources in publish mode, including the six explicitly opted-in resources.

The command succeeded. A dedicated evidence file recorded zero REPL commands on each of the 12 resources.

This checks publish-mode command registration, not an actual deployment.

Evidence: publish.log, publish-counts.log.

Summary

Scenario Status
Current-head artifact identity Passed
C# opt-in, six default-off checks, 12 query/exit cycles Passed
TypeScript opt-in, six default-off checks, 12 query/exit cycles Passed
Custom PostgreSQL/MySQL ports, four query/exit cycles Passed
Redis/MongoDB variants, eight query/exit cycles Passed
Stopped REPL command disabled Passed
Replacement-container connection Passed
Stale credentials visibly fail Passed
Publish-mode command exclusion Passed

Harness notes and limits

  • Initial browser attempts required corrections for the dock overlapping resource rows, action-menu dismissal, and rapid repeat commands during the dashboard's existing one-second command re-enable delay. The successful runs used a larger viewport, explicit menu dismissal, terminal-state polling, and two rounds through each client matrix. Preliminary failed automation attempts were not counted as passing scenarios.
  • The stopped resource's dashboard label did not match an initial selector that assumed the raw Exited state. The final check selected the resource by name and verified the actual menu-item disabled state.
  • Client process survival after closing a tab without quitting is an accepted limitation. It was not treated as a failure, and no cleanup workaround was introduced.
  • Podman, Windows/Linux hosts, and the legacy SQL Server client path were not exercised.
  • The 135 focused source tests had already passed after the timeout change; this report describes the subsequent published-artifact validation.
  • No production source was changed during artifact testing.

Overall result

PR VERIFIED for the tested macOS/Docker scenarios at 392e1d1877.

Evidence includes 21 screenshots, browser terminal snapshots, CLI/model logs, and repro-apps.tar.gz containing the five fixture AppHosts/configuration. Test AppHosts and the dedicated browser were stopped. Only the pre-existing cache-qubrcadt container remained running after testing.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b4c5fc2e-7805-44de-b46c-7d59e732ccf7
@aspire-repo-bot
aspire-repo-bot Bot requested a balanced review from Copilot September 21, 2026 03:07
@github-actions

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.

Remove stale Aspire.Hosting.Terminals imports from REPL integrations and shared helpers; terminal types now resolve through Aspire.Hosting.ApplicationModel.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b4c5fc2e-7805-44de-b46c-7d59e732ccf7
@github-actions

Copy link
Copy Markdown
Contributor

Tests selector

42 / 99 PR test projects · 4 PR jobs, from 29 changed files.

Selected PR test projects (42 / 99)

Aspire.Cli.EndToEnd.Tests, Aspire.Hosting.Azure.Kubernetes.Tests, Aspire.Hosting.Azure.Kusto.Tests, Aspire.Hosting.Azure.Tests, Aspire.Hosting.Blazor.Tests, Aspire.Hosting.Browsers.Tests, Aspire.Hosting.Containers.Tests, Aspire.Hosting.DevTunnels.Tests, Aspire.Hosting.Docker.Tests, Aspire.Hosting.Dotnet.Tests, Aspire.Hosting.DotnetTool.Tests, Aspire.Hosting.EntityFrameworkCore.Tests, Aspire.Hosting.Foundry.Tests, Aspire.Hosting.Garnet.Tests, Aspire.Hosting.Go.Tests, Aspire.Hosting.Java.Tests, Aspire.Hosting.JavaScript.Tests, Aspire.Hosting.Kafka.Tests, Aspire.Hosting.Keycloak.Tests, Aspire.Hosting.Kubernetes.Tests, Aspire.Hosting.Maui.Tests, Aspire.Hosting.Milvus.Tests, Aspire.Hosting.MongoDB.Tests, Aspire.Hosting.MySql.Tests, Aspire.Hosting.Nats.Tests, Aspire.Hosting.OpenAI.Tests, Aspire.Hosting.Oracle.Tests, Aspire.Hosting.Orleans.Tests, Aspire.Hosting.PostgreSQL.Tests, Aspire.Hosting.Python.Tests, Aspire.Hosting.Qdrant.Tests, Aspire.Hosting.RabbitMQ.Tests, Aspire.Hosting.Radius.Tests, Aspire.Hosting.Redis.Tests, Aspire.Hosting.Rust.Tests, Aspire.Hosting.Seq.Tests, Aspire.Hosting.SqlServer.Tests, Aspire.Hosting.Testing.Tests, Aspire.Hosting.Tests, Aspire.Hosting.Valkey.Tests, Aspire.Hosting.Yarp.Tests, Aspire.Playground.Tests

Selected PR jobs (4)

cli-starter-validation, extension-e2e, polyglot, typescript-api-compat


How these were chosen — grouped by what changed

⚠️ 31 of the 42 selected test projects come from a single change — tests/Aspire.Hosting.TestUtilities/Utils/TerminalCommandTestHelpers.cs.

🧪 tests/Aspire.Hosting.TestUtilities/Utils/TerminalCommandTestHelpers.cs (changed test)
→ 31 via the project graph

show 31

Aspire.Hosting.Azure.Kubernetes.Tests, Aspire.Hosting.Azure.Kusto.Tests, Aspire.Hosting.Blazor.Tests (2 hops), Aspire.Hosting.Browsers.Tests, Aspire.Hosting.Containers.Tests, Aspire.Hosting.DevTunnels.Tests, Aspire.Hosting.Docker.Tests, Aspire.Hosting.Dotnet.Tests (2 hops), Aspire.Hosting.DotnetTool.Tests, Aspire.Hosting.EntityFrameworkCore.Tests, Aspire.Hosting.Foundry.Tests, Aspire.Hosting.Garnet.Tests, Aspire.Hosting.Go.Tests, Aspire.Hosting.Java.Tests, Aspire.Hosting.JavaScript.Tests, Aspire.Hosting.Kafka.Tests, Aspire.Hosting.Keycloak.Tests, Aspire.Hosting.Kubernetes.Tests, Aspire.Hosting.Maui.Tests, Aspire.Hosting.Milvus.Tests, Aspire.Hosting.Nats.Tests, Aspire.Hosting.OpenAI.Tests, Aspire.Hosting.Oracle.Tests, Aspire.Hosting.Orleans.Tests, Aspire.Hosting.Python.Tests, Aspire.Hosting.Qdrant.Tests, Aspire.Hosting.RabbitMQ.Tests, Aspire.Hosting.Rust.Tests, Aspire.Hosting.Seq.Tests, Aspire.Hosting.Tests, Aspire.Hosting.Yarp.Tests

🔧 src/Aspire.Hosting.MongoDB/Aspire.Hosting.MongoDB.csproj (changed source)
→ 1 directly: Aspire.Hosting.MongoDB.Tests
→ 2 via the project graph: Aspire.Hosting.Radius.Tests, Aspire.Playground.Tests (2 hops)

🔧 src/Aspire.Hosting.PostgreSQL/Aspire.Hosting.PostgreSQL.csproj (changed source)
→ 1 directly: Aspire.Hosting.PostgreSQL.Tests
→ 2 via the project graph: Aspire.Hosting.Azure.Tests (2 hops), Aspire.Hosting.Testing.Tests (2 hops)

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

📄 playground/Terminals/Terminals.AppHost/AppHost.cs (changed)
→ 1 directly: Aspire.Playground.Tests

📄 playground/Terminals/Terminals.AppHost/Terminals.AppHost.csproj (changed)
→ 1 directly: Aspire.Playground.Tests

🔧 src/Aspire.Hosting.MongoDB/MongoDBBuilderExtensions.cs (changed source)
→ 1 directly: Aspire.Hosting.MongoDB.Tests

🔧 src/Aspire.Hosting.MySql/Aspire.Hosting.MySql.csproj (changed source)
→ 1 directly: Aspire.Hosting.MySql.Tests

🔧 src/Aspire.Hosting.MySql/MySqlBuilderExtensions.cs (changed source)
→ 1 directly: Aspire.Hosting.MySql.Tests

🔧 src/Aspire.Hosting.PostgreSQL/PostgresBuilderExtensions.cs (changed source)
→ 1 directly: Aspire.Hosting.PostgreSQL.Tests

🔧 src/Aspire.Hosting.Redis/Aspire.Hosting.Redis.csproj (changed source)
→ 1 directly: Aspire.Hosting.Redis.Tests

🔧 src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs (changed source)
→ 1 directly: Aspire.Hosting.Redis.Tests

🔧 src/Aspire.Hosting.SqlServer/Aspire.Hosting.SqlServer.csproj (changed source)
→ 1 directly: Aspire.Hosting.SqlServer.Tests

🔧 src/Aspire.Hosting.SqlServer/SqlServerBuilderExtensions.cs (changed source)
→ 1 directly: Aspire.Hosting.SqlServer.Tests

🔧 src/Aspire.Hosting.Valkey/Aspire.Hosting.Valkey.csproj (changed source)
→ 1 directly: Aspire.Hosting.Valkey.Tests

🔧 src/Aspire.Hosting.Valkey/ValkeyBuilderExtensions.cs (changed source)
→ 1 directly: Aspire.Hosting.Valkey.Tests

🧪 tests/Aspire.Hosting.MongoDB.Tests/Aspire.Hosting.MongoDB.Tests.csproj (changed test)
→ 1 directly: Aspire.Hosting.MongoDB.Tests

🧪 tests/Aspire.Hosting.MongoDB.Tests/MongoDBReplCommandTests.cs (changed test)
→ 1 directly: Aspire.Hosting.MongoDB.Tests

🧪 tests/Aspire.Hosting.MySql.Tests/Aspire.Hosting.MySql.Tests.csproj (changed test)
→ 1 directly: Aspire.Hosting.MySql.Tests

🧪 tests/Aspire.Hosting.MySql.Tests/MySqlReplCommandTests.cs (changed test)
→ 1 directly: Aspire.Hosting.MySql.Tests

🧪 tests/Aspire.Hosting.PostgreSQL.Tests/Aspire.Hosting.PostgreSQL.Tests.csproj (changed test)
→ 1 directly: Aspire.Hosting.PostgreSQL.Tests

🧪 tests/Aspire.Hosting.PostgreSQL.Tests/PostgresReplCommandTests.cs (changed test)
→ 1 directly: Aspire.Hosting.PostgreSQL.Tests

🧪 tests/Aspire.Hosting.Redis.Tests/Aspire.Hosting.Redis.Tests.csproj (changed test)
→ 1 directly: Aspire.Hosting.Redis.Tests

🧪 tests/Aspire.Hosting.Redis.Tests/RedisReplCommandTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Redis.Tests

🧪 tests/Aspire.Hosting.SqlServer.Tests/Aspire.Hosting.SqlServer.Tests.csproj (changed test)
→ 1 directly: Aspire.Hosting.SqlServer.Tests

🧪 tests/Aspire.Hosting.SqlServer.Tests/SqlServerReplCommandTests.cs (changed test)
→ 1 directly: Aspire.Hosting.SqlServer.Tests

🧪 tests/Aspire.Hosting.Valkey.Tests/Aspire.Hosting.Valkey.Tests.csproj (changed test)
→ 1 directly: Aspire.Hosting.Valkey.Tests

🧪 tests/Aspire.Hosting.Valkey.Tests/ValkeyReplCommandTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Valkey.Tests

Job reasons

Job Triggered by
cli-starter-validation affected project Aspire.Hosting.PostgreSQL
extension-e2e • src/Aspire.Hosting.Redis/Aspire.Hosting.Redis.csproj, src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs
• affected project Aspire.Hosting.Redis
polyglot • affected project Aspire.Hosting.MongoDB
• affected project Aspire.Hosting.Azure.Provisioning.Sql
typescript-api-compat affected project Aspire.Hosting.MongoDB

Selection computed for commit 7369267.

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.

Copilot review overview

🔵 Needs a closer look

Authenticated administrative terminals introduce substantial security exposure, and the PR explicitly lacks formal threat modeling and security review.

Review effort: Balanced
Findings: None

@github-actions

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.

@github-actions

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 Author

Regarding the security concern in the latest Copilot review: a threat model for this feature is underway. This does not indicate that threat modeling or security review is complete.

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.

Reviewed the shared REPL command, all six integrations, terminal lifecycle, and regression coverage at 7369267. Focused tests and real-path PostgreSQL/Redis terminal interactions passed. No blocking issues found.

@mitchdenny
Mitch Denny (mitchdenny) merged commit e9944f9 into main Sep 24, 2026
796 of 806 checks passed
@microsoft-github-policy-service microsoft-github-policy-service Bot added this to the 14.0 milestone Sep 24, 2026
@mitchdenny

Copy link
Copy Markdown
Member Author

/backport to release/13.6

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/13.6 (link to workflow run)

aspire-repo-bot Bot added a commit to microsoft/aspire.dev that referenced this pull request Sep 24, 2026
…egrations

Adds documentation for the opt-in WithRepl() extension method that
adds a REPL dashboard command for PostgreSQL, MySQL, MongoDB, SQL
Server, Redis, and Valkey hosting integrations (microsoft/aspire#20231).

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

Copy link
Copy Markdown
Contributor

Pull request created: #1740

Generated by PR Documentation Check · copilot · auto · 83.4 AIC · ⌖ 12.8 AIC · ⊞ 18.7K

@aspire-repo-bot

Copy link
Copy Markdown
Contributor

📝 Documentation has been drafted in microsoft/aspire.dev#1740 targeting release/13.6.

Documented the new opt-in WithRepl() dashboard REPL command (source PR #20231) across all six affected hosting integrations: PostgreSQL, MySQL, MongoDB, SQL Server, Redis, and Valkey.

Triggered signals and evidence:

  • integration_readme_changed — evidence in src/Aspire.Hosting.{MongoDB,MySql,PostgreSQL,Redis,SqlServer,Valkey}/README.md, each adding an "Interactive REPL"/"REPL" section describing WithRepl().
  • pr_body_has_user_facing_section — PR body's "### User-facing usage" section shows the WithRepl()/withRepl() C# and TypeScript API calls for all six integrations.

Docs changes: Added a new "Add [Resource] with a REPL command" section to each *-host.mdx page (postgres-host.mdx, mysql-host.mdx, mongodb-host.mdx, sql-server-host.mdx, redis-host.mdx, valkey-host.mdx), each with synced C#/TypeScript AppHost tabs, disabled-by-default/run-mode-only behavior, exit/quit-before-closing guidance, and a :::caution callout on trusted-user access matching the PR's security considerations section.

Note

This draft PR needs human review before merging.

Jose Perez Rodriguez (joperezr) pushed a commit that referenced this pull request Sep 25, 2026
…ations (#20419)

Backport of #20231 to release/13.6

/cc @mitchdenny

## Customer Impact

Adds opt-in dashboard REPL access for PostgreSQL, Redis, Valkey,
MongoDB, MySQL, and SQL Server, using bundled clients and configured
credentials where applicable. Developers can query local resources
without installing clients or copying credentials. Existing applications
are unchanged unless they enable `WithRepl()`.

## Testing

On the source PR, all 135 focused REPL tests passed. Published-artifact
testing covered C# and TypeScript opt-in behavior, all six clients,
custom ports, TLS/replica sets, normal exit/reopen, restart recovery,
authentication failure, and publish-mode exclusion. Source PR CI passed.

## Risk

Low. The functionality is explicitly opt-in and run-mode-only, leaving
existing applications unchanged. It uses the existing terminal
infrastructure without changing shared terminal lifecycle behavior.

## Regression?

No — this is an additive feature, not a regression fix.

---------

Co-authored-by: Mitch Denny <midenn@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b4c5fc2e-7805-44de-b46c-7d59e732ccf7
Copilot-Session: 25d3f000-f5c9-4806-bcf6-86475c51c89c
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>
David Negstad (danegsta) added a commit to microsoft/aspire.dev that referenced this pull request Sep 29, 2026
[![aspire.dev vnext
(13.6)](https://img.shields.io/badge/aspire.dev-vnext_(13.6)-512BD4?style=flat&logoColor=white&logo=...)](https://aka.ms/aspire/vnext)

## Summary

Prepare the Aspire 13.6 documentation release. The release article is
reconciled against [`microsoft/aspire` release/13.6 at
`a11eca9611073f7cf66fa87faac63c2119e87713`](https://github.com/microsoft/aspire/tree/a11eca9611073f7cf66fa87faac63c2119e87713),
compared with `v13.5.0`. The inventory contains 402 first-parent history
entries, including maintenance, merges, and reversions—not 402 distinct
shipped features.

Highlights cover dashboard persistence/run history and terminals; Java,
Rust, Connector Namespace and Sandboxes; coordinated .NET builds; CLI
and VS Code workflows; deployment and integration improvements; emulator
images; and migration guidance for Cosmos DB, Front Door,
connection-string aliases, and terminal namespaces.

### Published documentation and ingestion work

- `94b5f0c19`: migrate Java guides from Toolkit to first-party hosting,
document typed Azure provisioning customization and VS Code agent
lifecycle tools, and refresh 34 container-image records from the pinned
release source. Default tag changes: App Configuration `1.0.2 → 1.2.0`,
Cosmos DB `stable → vnext-latest`.
- `27e2db77a`: exact release-version selection, ATS-only package
metadata, union and canonical SDK enum handling, empty C# navigation
filtering, and fail-closed handling of SDK dump errors.
- `0b64558c1`: reconcile all 29 contributors against the pinned release
snapshot.
- `2696e2207`: recognize const-object enum declarations, retain
colliding enum-name literals in the shared Twoslash bundle while
preserving exact package-specific JSON, and increase the full
example-audit time budget for the larger dataset.
- `7ab5f74bd`: include the exact Dotnet package as supporting scan
context for Radius's generic .NET program export; subtract
core/supporting modules without dropping Radius's real IDs or receiver
targets.
- **`44b9819bb`: publish the complete, validated 13.6 catalog, mappings,
C#/TypeScript API data, and Twoslash bundle together.**
- Concurrent release updates are preserved, including the environment
badge and #1745's agent lifecycle options. Isolation/launch-profile
inputs were confirmed in the pinned 13.6 source.
- Related product changes: microsoft/aspire#18033,
microsoft/aspire#19675, and microsoft/aspire#19134.

The maintainer-set planned release date remains September 29, 2026
(#1690). Published package constants remain separate from prerelease
ingestion. Release membership comes from product source, not merely a
docs PR's target; #1740 documents microsoft/aspire#20231 (14.0), not a
13.6 feature.

### Generated data and provenance

The published snapshot contains **217 catalog entries**, **161
documentation mappings** (including the 26 new mappings), **210 C#
records**, **146 TypeScript modules**, and the rebuilt Twoslash bundle.
There are 132 official packages at exact version
`13.6.0-preview.1.26473.12`, with **no 14.x imports**. Independently
versioned packages retain their selected catalog versions.

Generation used genuine pinned packages from the public dotnet9 feed and
an isolated, locally built **13.6** CLI/RemoteHost. Package provenance
remains `a11eca9611073f7cf66fa87faac63c2119e87713`; the scanner fixes
are separate development-build provenance, not a claim that an official
corrected CLI has shipped.

- Full TypeScript ingestion with the inherited-method fix
(`320eed42f85a7d4b090a9429b98c7a6a8547a4b8`) produced 146 modules, 0
failures, and 7 explicit skips.
- Core/Radius regeneration with the additional target-specificity fix
(`435fd4eb7d06ef99702ae5106cf01c10f5c6a780`) succeeded. The real
compound Radius + exact Dotnet SDK dump has no diagnostics and retains
both `withContainerImage` and `withDotnetProgramContainerImage`
capability IDs.
- ProjectResource/CSharpAppResource use the concrete Radius export;
DotnetProjectResource uses the generic export. Dotnet's APIs are not
attributed to Radius. No source-package attributes, capability
identities, or missing-export checks were altered to force validation
through.

## Third-party links and affiliations

- Radius documentation — no material affiliation.
- Source/specification links remain within `microsoft/aspire`; Java
debugger links point to the corresponding Visual Studio Marketplace
extensions. No new material affiliation claims.

## Validation

- All **25 authored TypeScript guide/release examples** pass against the
final declaration bundle; guide samples were also compiled with the
genuine generated SDK.
- The **complete annotated-site Twoslash audit passes**, with no
diagnostic suppression.
- Final semantic validation passes: 217 package identities, 146
module-provenance matches, 74 DTO shapes, and 2,873 handle inheritance
chains.
- **82 structured-data tests**, **75
API-reference/declaration-generator/API-route tests**, and **17 ATS
transformer tests** pass. The final API-reference gate resolves the
Radius exports without exceptions or aliases.
- Earlier compile-only C# validation covered 24 guide methods and one
type declaration without warnings or errors. Browser checks covered
Java, Azure customization, VS Code and AI-agent routes and language
tabs.
- Source scanner/dispatcher/context-filter/API-export regressions: **215
pass on each product branch**, including exact-package dispatch and
generated-SDK compilation checks.
- No local production site build, cloud deployment, destructive cleanup
scenario, CLI self-update, or release workflow was run. Current-head CI
must still complete after the latest pushes.

## Remaining release gates

- **Main scanner fix: microsoft/aspire#20438**, ready for review, latest
commit `5482164dc1225f3c2a1a93bf5055e11b720117e9`. **13.6 backport:
microsoft/aspire#20443**, draft, latest commit
`435fd4eb7d06ef99702ae5106cf01c10f5c6a780`. Both require human
review/merge; neither has been merged or released by this session.
Latest-commit CI is still being monitored.
- Official shipping requires the corrected RemoteHost-containing
CLI/bundle. Rebuilding Network or Radius alone is insufficient. Local
documentation generation does not replace that packaging gate.
- The Express diagnostic short link requires owner action:
#1599 (comment).
- Complete current-head docs CI and final release/runtime acceptance.
Keep this PR draft until the release gates are satisfied.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: James Newton-King <james@newtonking.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: JamesNK <303201+JamesNK@users.noreply.github.com>
Co-authored-by: David Pine <7679720+IEvangelist@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Maddy Montaquila <maddy@pi.hole>
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
Co-authored-by: Ella Hathaway <ellahathaway@microsoft.com>
Co-authored-by: aspire-repo-bot[bot] <aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: David Aniebo <aniebovictor001@gmail.com>
Co-authored-by: Alistair Matthews <alistairwebdojo@live.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Maddy Montaquila <maddy@MadBook-Pro-20.local>
Co-authored-by: Ella Hathaway <67609881+ellahathaway@users.noreply.github.com>
Co-authored-by: David Pine <dapine@microsoft.com>
Co-authored-by: Nell Shamrell-Harrington <nellshamrell@gmail.com>
Co-authored-by: David Negstad <50252651+danegsta@users.noreply.github.com>
Co-authored-by: Sébastien Ros <sebastienros@gmail.com>
Co-authored-by: David Negstad <David.Negstad@microsoft.com>
Co-authored-by: Sébastien Ros <1165805+sebastienros@users.noreply.github.com>
Co-authored-by: karolz-ms <15271049+karolz-ms@users.noreply.github.com>
Co-authored-by: Karol Zadora-Przylecki <karolz@microsoft.com>
Co-authored-by: Mitch Denny <midenn@microsoft.com>
Co-authored-by: Mitch Denny <midenn@orangecake.local>
Co-authored-by: Mitch Denny <midenn@Mac.localdomain>
Co-authored-by: Jose Perez Rodriguez <joperezr@microsoft.com>
Co-authored-by: Maddy Montaquila <maddyleger1@gmail.com>
Co-authored-by: Maddy Montaquila <maleger@microsoft.com>
Copilot-Session: b0007635-1ab8-4ffc-9c7b-8c09439c79f6
Copilot-Session: 9ecc352e-ddd2-4c3e-9c4a-eafcc2a74157
Copilot-Session: b8ebe88c-337e-4d4a-aa80-e14c2c76289b
Copilot-Session: 5b0c81a3-d822-462e-8cf5-8eb6debfe968
Copilot-Session: b156fe61-0b1c-460c-9735-1eaeaa356b0a
Copilot-Session: 41298945-9592-4284-be9e-be0c58f31fad
Copilot-Session: 5eeee6c8-e0b2-4836-96ff-a9726e92b2ee
Copilot-Session: 829e510d-2b06-4301-9759-3bd760c45e5c
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 24, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-integrations Issues pertaining to Aspire Integrations packages

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants