Skip to content

[release/13.4] 13.4: Load Aspire skills catalog from bundle manifest#17673

Merged
joperezr merged 1 commit into
release/13.4from
dapine/backport-pr-17553-release-13.4
May 29, 2026
Merged

[release/13.4] 13.4: Load Aspire skills catalog from bundle manifest#17673
joperezr merged 1 commit into
release/13.4from
dapine/backport-pr-17553-release-13.4

Conversation

@IEvangelist
Copy link
Copy Markdown
Member

Backport of #17553 to release/13.4

Customer Impact

Customers using aspire agent init in 13.4 see an incomplete Aspire skills catalog because the CLI uses a stale hardcoded list instead of the bundled manifest. Bundle-only skills such as aspire-init, aspire-monitoring, and aspire-orchestration are hidden from the prompt and from --skills; disconnected fallback can show only CLI-local skills.

Testing

Validated this manual backport with targeted release-branch tests: AgentInitCommandTests passed 36/36, and AspireSkillsBundleTests + AspireSkillsInstallerTests passed 25/25. Source PR validation also reports AgentInitCommandTests, AspireSkillsBundleTests, and AspireSkillsInstallerTests passing locally, plus manual PR-build verification with deleted skills cache and disconnected network.

Risk

Low. The change is localized to Aspire CLI agent-init skill catalog/bundle resolution and the new remote-fetch feature flag defaults off, so normal 13.4 behavior uses cache or the embedded snapshot unless users explicitly opt in to remote fetch.

Regression?

Unknown — the source PR fixes #17551 but does not explicitly state whether this regressed from an earlier release.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings May 29, 2026 18:20
@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 -- 17673

Or

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

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Backports the 13.4 fix that makes aspire agent init derive its bundled skill catalog from the Aspire skills bundle manifest (instead of a hardcoded list), with a new opt-in feature flag to enable GitHub remote bundle fetch (default off).

Changes:

  • Build the selectable/installable bundled-skill catalog from skill-manifest.json, while keeping only CLI-local skills as static definitions.
  • Add bindingChoices support to multi-select prompting so UX-only prompt items don’t become valid --skills values; strip Spectre markup from non-interactive “Available values” output.
  • Add/adjust tests (unit, integration, E2E) to validate bundle-derived skill listing/selection behavior and remote-fetch feature-flag behavior.

Reviewed changes

Copilot reviewed 40 out of 41 changed files in this pull request and generated no comments.

Show a summary per file
File Description
tests/Aspire.Cli.Tests/TestServices/TestInteractionService.cs Updates test interaction service to match new multi-select prompt signature.
tests/Aspire.Cli.Tests/TestServices/TestExtensionInteractionService.cs Updates extension test interaction service to match new multi-select prompt signature.
tests/Aspire.Cli.Tests/TestServices/FakePlaywrightServices.cs Expands fake Aspire skills bundle fixture to include additional bundle-only skills and updated manifest shape.
tests/Aspire.Cli.Tests/Templating/DotNetTemplateFactoryTests.cs Updates local test interaction service signature for multi-select prompts.
tests/Aspire.Cli.Tests/Projects/ExtensionGuestLauncherTests.cs Updates local test interaction service signature for multi-select prompts.
tests/Aspire.Cli.Tests/Interaction/ConsoleInteractionServiceTests.cs Adds tests for bindingChoices filtering and Spectre markup stripping in non-interactive validation output.
tests/Aspire.Cli.Tests/Commands/UpdateCommandTests.cs Updates wrapper interaction service to forward the new multi-select prompt parameter.
tests/Aspire.Cli.Tests/Commands/PublishCommandPromptingIntegrationTests.cs Updates test interaction service signature for multi-select prompts.
tests/Aspire.Cli.Tests/Commands/NewCommandTests.cs Aligns skill-path assertions with centralized skill-name constants and updated default selection behavior.
tests/Aspire.Cli.Tests/Commands/InitCommandTests.cs Updates skill selection test logic to work with bundle-derived skill definitions.
tests/Aspire.Cli.Tests/Commands/AgentInitCommandTests.cs Adds/updates coverage for bundle-derived skill catalog, selection defaults, escaping/sorting, and bundle-failure fallbacks.
tests/Aspire.Cli.Tests/Agents/CommonAgentApplicatorsTests.cs Updates tests to reflect that only non-bundle skills remain CLI-defined statics.
tests/Aspire.Cli.Tests/Agents/AspireSkillsInstallerTests.cs Adds tests for remote-fetch feature flag default-off behavior and cache/embedded fallback semantics.
tests/Aspire.Cli.Tests/Agents/AspireSkillsBundleTests.cs Adds tests for manifest-derived definitions and case-insensitive duplicate-skill detection; expands compatibility-skip coverage.
tests/Aspire.Cli.EndToEnd.Tests/AgentCommandTests.cs Adds E2E regression test ensuring bundle-only skills can be installed by name via --skills.
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.zh-Hant.xlf Updates localized resource entry for revised --skills help text.
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.zh-Hans.xlf Updates localized resource entry for revised --skills help text.
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.tr.xlf Updates localized resource entry for revised --skills help text.
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.ru.xlf Updates localized resource entry for revised --skills help text.
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.pt-BR.xlf Updates localized resource entry for revised --skills help text.
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.pl.xlf Updates localized resource entry for revised --skills help text.
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.ko.xlf Updates localized resource entry for revised --skills help text.
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.ja.xlf Updates localized resource entry for revised --skills help text.
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.it.xlf Updates localized resource entry for revised --skills help text.
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.fr.xlf Updates localized resource entry for revised --skills help text.
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.es.xlf Updates localized resource entry for revised --skills help text.
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.de.xlf Updates localized resource entry for revised --skills help text.
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.cs.xlf Updates localized resource entry for revised --skills help text.
src/Aspire.Cli/Resources/AgentCommandStrings.resx Updates --skills option description to reflect dynamic bundle catalog + CLI-defined skills.
src/Aspire.Cli/Resources/AgentCommandStrings.Designer.cs Updates generated designer comment to match new --skills option description string.
src/Aspire.Cli/KnownFeatures.cs Introduces aspireSkillsRemoteFetchEnabled feature flag (default off).
src/Aspire.Cli/Interaction/IInteractionService.cs Extends multi-select prompt API with bindingChoices for non-interactive validation narrowing.
src/Aspire.Cli/Interaction/ExtensionInteractionService.cs Applies bindingChoices for non-interactive validation and forwards parameter to console prompt fallback.
src/Aspire.Cli/Interaction/ConsoleInteractionService.cs Implements bindingChoices and strips Spectre markup in non-interactive invalid-value diagnostics.
src/Aspire.Cli/Commands/NewCommand.cs Calls agent-init chaining with a predicate to avoid preselecting one-time setup skills post-template.
src/Aspire.Cli/Commands/InitCommand.cs Keeps aspire init behavior of preselecting all bundle skills (including the one-time setup skill).
src/Aspire.Cli/Commands/AgentInitCommand.cs Resolves bundle catalog before prompting; merges bundle-derived and CLI-defined skills; improves prompt formatting, determinism, and failure messaging.
src/Aspire.Cli/Agents/SkillDefinition.cs Removes hardcoded bundle skill definitions; retains only CLI-defined static skills and adds a bundle-skill factory + name helper.
src/Aspire.Cli/Agents/AspireSkills/SkillBundleManifest.cs Removes obsolete IsDefault field from the manifest model.
src/Aspire.Cli/Agents/AspireSkills/AspireSkillsInstaller.cs Gates GitHub remote acquisition behind feature flag; adjusts cache/embedded loading to skip supports-range checks where appropriate.
src/Aspire.Cli/Agents/AspireSkills/AspireSkillsBundle.cs Adds manifest→SkillDefinition projection, optional supports-range compatibility skipping, and case-insensitive duplicate-skill validation.
Files not reviewed (1)
  • src/Aspire.Cli/Resources/AgentCommandStrings.Designer.cs: Language not supported

@joperezr joperezr enabled auto-merge (squash) May 29, 2026 19:13
@joperezr joperezr merged commit a364a66 into release/13.4 May 29, 2026
618 of 621 checks passed
@joperezr joperezr deleted the dapine/backport-pr-17553-release-13.4 branch May 29, 2026 19:20
@microsoft-github-policy-service microsoft-github-policy-service Bot added this to the 13.4 milestone May 29, 2026
@github-actions
Copy link
Copy Markdown
Contributor

CLI E2E Tests unknown — 109 passed, 0 failed, 2 unknown (commit 3c0f90d)

View all recordings
Status Test Recording Job Artifacts
AddPackageInteractiveWhileAppHostRunningDetached Recording #78569813195 Logs
AddPackageWhileAppHostRunningDetached Recording #78569813195 Logs
AgentCommands_AllHelpOutputs_AreCorrect Recording #78569813420 Logs
AgentInitCommand_DefaultSelection_InstallsDefaultSkills Recording #78569813420 Logs
AgentInitCommand_MigratesDeprecatedConfig Recording #78569813420 Logs
AgentInitCommand_NonInteractive_BundleOnlySkillsBeyondCliCatalog_AreInstallable Recording #78569813420 Logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp Recording #78569813478 Logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_DevLocalhost Recording #78569813478 Logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_Isolated Recording #78569813478 Logs
AllPublishMethodsBuildDockerImages Recording #78569812794 Logs
AspireAddAndStartWorkAgainstLegacyAppHostTs Recording #78569812938 Logs
AspireAddPackageVersionToDirectoryPackagesProps Recording #78569812179 Logs
AspireInitSingleFileAppHostRunsViaDotnetRunAppHost Recording #78569812812 Logs
AspireInitWithExistingAppHostDirRecreatesMissingNuGetConfigAndPreservesFiles Recording #78569813559 Logs
AspireInitWithSolutionFileGeneratesAppHostThatBuildsAgainstChannelHive Recording #78569813559 Logs
AspireStartUpdatesStaleTypeScriptAppHostPath Recording #78569813179 Logs
AspireUpdateRemovesAppHostPackageVersionFromDirectoryPackagesProps Recording #78569812179 Logs
AspireUpdateRemovesOrphanAppHostPackageVersionWhenSdkAlreadyCurrent Recording #78569812179 Logs
Banner_DisplayedOnFirstRun Recording #78569812901 Logs
Banner_DisplayedWithExplicitFlag Recording #78569812901 Logs
Banner_NotDisplayedWithNoLogoFlag Recording #78569812901 Logs
CertificatesClean_RemovesCertificates Recording #78569813157 Logs
CertificatesTrust_WithNoCert_CreatesAndTrustsCertificate Recording #78569813157 Logs
CertificatesTrust_WithUntrustedCert_TrustsCertificate Recording #78569813157 Logs
ConfigSetGet_CreatesNestedJsonFormat Recording #78569813336 Logs
CreateAndRunAspireStarterProject Recording #78569813447 Logs
CreateAndRunAspireStarterProjectWithBundle Recording #78569812844 Logs
CreateAndRunEmptyAppHostProject Recording #78569813354 Logs
CreateAndRunJavaEmptyAppHostProject Recording #78569813554 Logs
CreateAndRunJsReactProject Recording #78569813517 Logs
CreateAndRunPolyglotAppHostWithDevLocalhostUrls Recording #78569813447 Logs
CreateAndRunPythonReactProject Recording #78569812857 Logs
CreateAndRunTypeScriptEmptyAppHostProject Recording #78569813301 Logs
CreateAndRunTypeScriptStarterProject Recording #78569813427 Logs
CreateJavaAppHostWithViteApp Recording #78569813222 Logs
CreateTypeScriptAppHostWithViteApp_AllowsGuestAppPackageManagerToDiffer Recording #78569813057 Logs
CreateTypeScriptAppHostWithViteApp_UsesConfiguredToolchain Recording #78569813057 Logs
DashboardRunWithAgentMcpListTracesReturnsNoTraces Recording #78569813213 Logs
DashboardRunWithAgentMcpListTracesReturnsNoTraces_DevLocalhost Recording #78569813213 Logs
DashboardRunWithOtelTracesReturnsNoTraces Recording #78569813213 Logs
DashboardRunWithOtelTracesReturnsNoTraces_DevLocalhost Recording #78569813213 Logs
DeployK8sBasicApiService Recording #78569812895 Logs
DeployK8sWithExternalHelmChart Recording #78569812851 Logs
DeployK8sWithGarnet Recording #78569813228 Logs
DeployK8sWithMongoDB Recording #78569812935 Logs
DeployK8sWithMySql Recording #78569813481 Logs
DeployK8sWithPostgres Recording #78569812873 Logs
DeployK8sWithRabbitMQ Recording #78569812974 Logs
DeployK8sWithRedis Recording #78569813362 Logs
DeployK8sWithSqlServer Recording #78569812872 Logs
DeployK8sWithValkey Recording #78569812885 Logs
DeployTypeScriptAppToKubernetes Recording #78569812779 Logs
DescribeCommandResolvesReplicaNames Recording #78569812362 Logs
DescribeCommandShowsRunningResources Recording #78569812362 Logs
DetachFormatJsonProducesValidJson Recording #78569813291 Logs
DetachFormatJsonProducesValidJsonWhenRestartingExistingInstance Recording #78569813291 Logs
DoPublishAndDeployListStepsWork Recording #78569812987 Logs
DocsCommand_RendersInteractiveMarkdownFromLocalSource Recording #78569813252 Logs
DoctorCommand_DetectsDeprecatedAgentConfig Recording #78569813420 Logs
DoctorCommand_TypeScriptAppHostReportsMissingConfiguredToolchain Recording #78569812892 Logs
DoctorCommand_WithSslCertDir_ShowsTrusted Recording #78569812892 Logs
DoctorCommand_WithoutSslCertDir_ShowsPartiallyTrusted Recording #78569812892 Logs
GatewayWithoutExternalEndpoint_FailsPublishWithGuidance Recording #78569812118 Logs
GeneratedAspireDevScript_StartsWatchMode_WithConfiguredToolchain Recording #78569813057 Logs
GlobalMigration_HandlesCommentsAndTrailingCommas Recording #78569813336 Logs
GlobalMigration_HandlesMalformedLegacyJson Recording #78569813336 Logs
GlobalMigration_PreservesAllValueTypes Recording #78569813336 Logs
GlobalMigration_SkipsWhenNewConfigExists Recording #78569813336 Logs
GlobalSettings_MigratedFromLegacyFormat Recording #78569813336 Logs
IngressWithoutExternalEndpoint_FailsPublishWithGuidance Recording #78569812118 Logs
InitTypeScriptAppHost_AugmentsExistingViteRepoInWorkspaceSubdirectory Recording #78569813057 Logs
InteractiveCSharpInitCreatesExpectedFiles Recording #78569812790 Logs
InvalidAppHostPathWithComments_IsHealedOnRun Recording #78569812863 Logs
JavaScriptHostingApisRunFromTypeScriptAppHost Recording #78569812794 Logs
LatestCliCanStartStableChannelAppHost Recording #78569813447 Logs
LatestCliCanStartStableChannelTypeScriptAppHost Recording #78569813447 Logs
LegacySettingsMigration_AdjustsRelativeAppHostPath Recording #78569813179 Logs
LogsCommandShowsResourceLogs Recording #78569812137 Logs
OtelLogsReturnsStructuredLogsFromStarterApp Recording #78569812707 Logs
OtelLogsReturnsStructuredLogsFromStarterAppIsolated Recording #78569812707 Logs
PsCommandListsRunningAppHost Recording #78569813356 Logs
PsFormatJsonOutputsOnlyJsonToStdout Recording #78569813356 Logs
PublishJavaScriptPatternsGeneratesExpectedDockerComposeArtifacts Recording #78569812758 Logs
PublishWithConfigureEnvFileUpdatesEnvOutput Recording #78569812758 Logs
PublishWithDockerComposeServiceCallbackSucceeds Recording #78569812758 Logs
PublishWithoutOutputPathUsesAppHostDirectoryDefault Recording #78569812758 Logs
ResourceCommand_FailedExecution_DisplaysAppHostLogPathAndLogContainsEntries Recording #78569812704 Logs
ResourceCommand_SetAndDeleteParameterUpdatesDescribeOutput Recording #78569812704 Logs
RestoreGeneratesSdkFiles Recording #78569812918 Logs
RestoreGeneratesSdkFiles_WithConfiguredToolchain Recording #78569812765 Logs
RestoreRefreshesGeneratedSdkAfterAddingIntegration Recording #78569812765 Logs
RestoreSupportsConfigOnlyHelperPackageAndCrossPackageTypes Recording #78569813556 Logs
RunFromParentDirectory_UsesExistingConfigNearAppHost Recording #78569813210 Logs
RunReportsSyntaxErrorsForDotNetAppHost Recording #78569813581 Logs
RunReportsSyntaxErrorsForTypeScriptAppHost Recording #78569813581 Logs
SecretCrudOnDotNetAppHost Recording #78569813440 Logs
SecretCrudOnTypeScriptAppHost Recording #78569812858 Logs
StagingChannel_ConfigureAndVerifySettings_ThenSwitchChannels Recording #78569812802 Logs
StartAndWaitForTypeScriptSqlServerAppHostWithNativeAssets Recording #78569812820 Logs
StartReportsSyntaxErrorsForDotNetAppHost Recording #78569813581 Logs
StartReportsSyntaxErrorsForTypeScriptAppHost Recording #78569813581 Logs
StopAllAppHostsFromAppHostDirectory Recording #78569812830 Logs
StopJavaPolyglotAppHostUsingApphostDirectory Recording #78569812866 Logs
StopNonInteractiveSingleAppHost Recording #78569812830 Logs
StopTypeScriptPolyglotAppHostUsingApphostDirectory Recording #78569812309 Logs
StopWithNoRunningAppHostExitsSuccessfully Recording #78569813195 Logs
UnAwaitedChainsCompileWithAutoResolvePromises Recording #78569812765 Logs
UpdateProjectChannelToStable_CSharpEmptyAppHost_PreservesAspireConfigChannel Recording #78569812197 Logs
UpdateProjectChannelToStable_CSharpSingleFileInit_PreservesAspireConfigChannel Recording #78569812197 Logs
UpdateProjectChannelToStable_TypeScriptSingleFileInit_PreservesAspireConfigChannel Recording #78569812197 Logs
UpdateProjectChannelToStable_TypeScript_PreviewsStablePackagesAndPreservesChannel Recording #78569812197 Logs

📹 Recordings uploaded automatically from CI run #26654539636

aspire-repo-bot Bot added a commit to microsoft/aspire.dev that referenced this pull request May 29, 2026
The aspire agent init command now loads the available skill catalog from
the Aspire skills bundle manifest instead of a hardcoded list. This
surfaces bundle-only skills (aspire-init, aspire-monitoring,
aspire-orchestration) in the interactive prompt and via --skills.

Key behavior changes documented:
- Available skills are loaded dynamically from the bundle manifest.
- CLI-defined skills (playwright-cli, dotnet-inspect) remain as static options.
- One-time setup skills (aspireify) are no longer pre-selected by default
  in standalone aspire agent init runs.
- New aspireSkillsRemoteFetchEnabled feature flag (default: false) controls
  whether the CLI may download the bundle from GitHub.

Documents changes from microsoft/aspire#17673.

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

Pull request created: #1129

Generated by PR Documentation Check

@aspire-repo-bot
Copy link
Copy Markdown
Contributor

📝 Documentation has been drafted in microsoft/aspire.dev#1129 targeting release/13.4.

Updated src/frontend/src/content/docs/reference/cli/commands/aspire-agent-init.mdx to document the bundle-derived skill catalog change:

  • Revised Description step 2: the skill catalog is now loaded from the Aspire skills bundle manifest (adding skills like aspire-init, aspire-monitoring, aspire-orchestration); one-time setup skills (aspireify) are no longer pre-selected by default in standalone runs.
  • Updated --skills option description: bundle skills are dynamic, CLI-provided skills (playwright-cli, dotnet-inspect) are static; added a note about the new aspireSkillsRemoteFetchEnabled feature flag (default off in 13.4).
  • Added an example for installing specific bundle skills by name.

Note

This draft PR needs human review before merging.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants