Skip to content

Migrate Aspire skills to external bundle - #17323

Merged
David Pine (IEvangelist) merged 12 commits into
mainfrom
dapine/skills-delegation-plan
May 26, 2026
Merged

Migrate Aspire skills to external bundle#17323
David Pine (IEvangelist) merged 12 commits into
mainfrom
dapine/skills-delegation-plan

Conversation

@IEvangelist

Copy link
Copy Markdown
Member

Description

Part of #17018.

This draft moves the CLI-shipped Aspire workflow skills (aspire, aspireify, and aspire-deployment) away from embedded resources in microsoft/aspire and toward delegated installation from the external microsoft/aspire-skills package. This keeps microsoft/aspire-skills on track to become the single source of truth for Aspire skill content while preserving the existing aspire agent init selection and install destinations.

The CLI now resolves a pinned @microsoft/aspire-skills bundle, verifies npm provenance and tarball integrity, validates the bundle manifest/file hashes, extracts it into the Aspire cache, and installs selected skill files from that cache. The embedded .agents/skills/{aspire,aspireify,aspire-deployment} trees and embedded resource loader were removed from the CLI project.

User-facing usage

Users keep running aspire agent init with the same skill names and destinations:

aspire agent init --skill-locations standard --skills aspire,aspireify,aspire-deployment

The first install of these Aspire workflow skills now requires npm/package access so the CLI can resolve and verify the pinned skills bundle. Subsequent installs reuse the validated cache under the Aspire cache directory:

%USERPROFILE%\.aspire\cache\aspire-skills\<version>\

This PR is a draft because the matching microsoft/aspire-skills package/manifest publishing work still needs to land before this is ready to ship.

Security considerations

This change downloads and extracts an npm tarball into a global Aspire cache directory. Security review is needed because the implementation makes package-source and archive-extraction guarantees: it verifies npm provenance, verifies SRI tarball integrity, validates manifest paths and SHA-256 file hashes, rejects unsafe relative paths, and does not perform a global npm install.

Validation

Passed targeted tests for the changed CLI surfaces:

.\.dotnet\dotnet.exe test --project .\tests\Aspire.Cli.Tests\Aspire.Cli.Tests.csproj -- --filter-class "*.AspireSkillsInstallerTests" --filter-class "*.AspireSkillsBundleTests" --filter-class "*.AgentInitCommandTests" --filter-class "*.CommonAgentApplicatorsTests" --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true"

Also ran the full Aspire.Cli.Tests project; it compiled and executed, with one failure in ListConsoleLogsToolTests.ListConsoleLogsTool_ReturnsLogs_ForSpecificResource due to Windows line-ending output (\n vs \r\n).

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

@github-actions

github-actions Bot commented May 20, 2026

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 -- 17323

Or

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

@davidfowl

David Fowler (davidfowl) commented May 21, 2026

Copy link
Copy Markdown
Collaborator

What happens if the user does not have npm?

@IEvangelist

Copy link
Copy Markdown
Member Author

David Fowler (@davidfowl) If npm is not available, behavior depends on whether the Aspire skills bundle is already cached:

  • If the bundle is already in the CLI cache, aspire agent init can still install the Aspire skills without npm.
  • If this is the first install and there is no cached bundle, the CLI cannot resolve @microsoft/aspire-skills.

With the follow-up fix I pushed, direct aspire agent init stays strict: it shows the npm-required error and exits non-zero because the user explicitly asked to configure agent skills. The chained follow-up from aspire new / aspire init is best-effort: it shows a warning, skips the external Aspire skills, and keeps the primary command successful so app creation/init is not blocked by missing npm.

Playwright CLI already has similar optional behavior for missing npm: it reports the skill as skipped/informational rather than failing the entire flow.

If we want full first-install support without npm, we'd need a second distribution path for the skills bundle, such as a signed GitHub release/archive or some other non-npm bootstrap source.

@IEvangelist

Copy link
Copy Markdown
Member Author

PR Testing Complete

Result: ✅ PR #17323 verified in container mode with local bundle seeding

Dogfooded PR CLI 13.4.0-pr.17323.g30d0ac75, matching head 30d0ac75.

Scenario Result Notes
Container runner smoke ✅ PASS Runner works via wrapper script; direct PowerShell 7 invocation hit runner script $IsWindows read-only issue
Install + version verification ✅ PASS CLI installed at /workspace/.aspire/dogfood/pr-17323/bin/aspire; version matches PR head
Local aspire-skills cache seeding ✅ PASS Generated skill-manifest.json from D:\GitHub\aspire-skills-pr5-review\skills and seeded /workspace/.aspire/cache/aspire-skills/0.0.1
aspire agent init --help ✅ PASS Help renders updated --skills values including aspire,aspireify,aspire-deployment,playwright-cli,dotnet-inspect
--skill-locations none --skills none ✅ PASS Completes without needing bundle/npm access
Bundle-backed install ✅ PASS Installed aspire, aspireify, and aspire-deployment into .agents/skills/* and ~/.agents/skills/*
Install exclusions ✅ PASS evals directories were not installed for all three skills
Cache reuse ✅ PASS After deleting installed skill folders, rerun reinstalled all three from seeded cache and updated .lastused

Important caveat: The real @microsoft/aspire-skills package is not published/available yet, so this validates the PR CLI’s validated-cache path using the local clone content rather than npm resolution/provenance/download. The package download/provenance path remains blocked until the external package exists.

Cleanup: Mounted temp workspace removed.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR migrates the CLI’s shipped Aspire workflow skills (aspire, aspireify, aspire-deployment) from embedded resources to an externally resolved, verified, and cached @microsoft/aspire-skills bundle, while keeping aspire agent init skill selection and install destinations consistent.

Changes:

  • Introduces an IAspireSkillsInstaller + bundle/manifest model to download/verify/extract/cache the external skills bundle and install selected files.
  • Refactors SkillDefinition to model skill sourcing via SkillSourceKind and removes embedded skill resource plumbing.
  • Updates unit/E2E tests and localization resources to cover/install the new bundle-backed skill flow.

Reviewed changes

Copilot reviewed 66 out of 67 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
tests/Aspire.Cli.Tests/Utils/CliTestHelper.cs Wires the new Aspire skills installer into test DI setup.
tests/Aspire.Cli.Tests/TestServices/FakePlaywrightServices.cs Adds a fake Aspire skills installer that materializes a minimal on-disk bundle for tests.
tests/Aspire.Cli.Tests/Commands/AgentInitCommandTests.cs Expands agent init coverage to include aspireify and bundle-unavailable behavior.
tests/Aspire.Cli.Tests/Agents/CommonAgentApplicatorsTests.cs Updates assertions for new skill sourcing model and adjusts installable-skill validation logic.
tests/Aspire.Cli.Tests/Agents/AspireSkillsInstallerTests.cs Adds unit tests for bundle caching and GitHub/npm acquisition fallbacks.
tests/Aspire.Cli.Tests/Agents/AspireSkillsBundleTests.cs Adds unit tests for manifest/path/hash/version-range validation and file filtering.
tests/Aspire.Cli.Tests/Acquisition/PeerInstallProbeTests.cs Makes timeout assertion less flaky under Windows CI load.
tests/Aspire.Cli.EndToEnd.Tests/PlaywrightCliInstallTests.cs Makes Playwright E2E deterministic by bypassing interactive prompts and excluding Aspire bundle skills.
tests/Aspire.Cli.EndToEnd.Tests/NewWithAgentInitTests.cs Updates interactive skill selection steps to deselect default bundle skills when testing Playwright acquisition.
tests/Aspire.Cli.EndToEnd.Tests/AgentCommandTests.cs Avoids depending on unpublished bundle by seeding the cache before default-selection E2E flow.
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.zh-Hant.xlf Adds new Aspire skills installer strings (localized placeholder entries).
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.zh-Hans.xlf Adds new Aspire skills installer strings (localized placeholder entries).
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.tr.xlf Adds new Aspire skills installer strings (localized placeholder entries).
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.ru.xlf Adds new Aspire skills installer strings (localized placeholder entries).
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.pt-BR.xlf Adds new Aspire skills installer strings (localized placeholder entries).
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.pl.xlf Adds new Aspire skills installer strings (localized placeholder entries).
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.ko.xlf Adds new Aspire skills installer strings (localized placeholder entries).
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.ja.xlf Adds new Aspire skills installer strings (localized placeholder entries).
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.it.xlf Adds new Aspire skills installer strings (localized placeholder entries).
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.fr.xlf Adds new Aspire skills installer strings (localized placeholder entries).
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.es.xlf Adds new Aspire skills installer strings (localized placeholder entries).
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.de.xlf Adds new Aspire skills installer strings (localized placeholder entries).
src/Aspire.Cli/Resources/xlf/AgentCommandStrings.cs.xlf Adds new Aspire skills installer strings (localized placeholder entries).
src/Aspire.Cli/Resources/AgentCommandStrings.resx Adds new installer status/error strings for Aspire skills bundle acquisition.
src/Aspire.Cli/Resources/AgentCommandStrings.Designer.cs Regenerates strongly-typed resource accessors for new strings.
src/Aspire.Cli/Program.cs Registers IAspireSkillsInstaller in the CLI DI container.
src/Aspire.Cli/Commands/McpInitCommand.cs Threads the Aspire skills installer into MCP init command construction.
src/Aspire.Cli/Commands/AgentInitCommand.cs Integrates bundle resolution (strict vs best-effort modes) and installs bundle-backed skill files.
src/Aspire.Cli/Aspire.Cli.csproj Removes embedded-resource includes for the shipped skill directories.
src/Aspire.Cli/Agents/SkillDefinition.cs Replaces embedded-resource roots with SkillSourceKind and adds HasInstallableFiles.
src/Aspire.Cli/Agents/SkillAssetFile.cs Introduces a dedicated SkillAssetFile record type.
src/Aspire.Cli/Agents/EmbeddedSkillResourceLoader.cs Removes the embedded-skill loader and inline SkillAssetFile definition.
src/Aspire.Cli/Agents/CommonAgentApplicators.cs Removes embedded-resource root constants for Aspire skill bundles.
src/Aspire.Cli/Agents/AspireSkills/SkillBundleManifest.cs Adds JSON models + source-gen context for the external skill bundle manifest.
src/Aspire.Cli/Agents/AspireSkills/IAspireSkillsInstaller.cs Adds the bundle installer abstraction for agent init.
src/Aspire.Cli/Agents/AspireSkills/AspireSkillsInstallResult.cs Adds result types for bundle resolution success/failure.
src/Aspire.Cli/Agents/AspireSkills/AspireSkillsBundle.cs Adds bundle loader with manifest validation, path safety checks, hash verification, and version-range checks.
src/Aspire.Cli/Agents/AspireSkills/AspireSkillsInstaller.cs Implements acquisition via GitHub tarball fallback and npm resolution with provenance + integrity verification, plus cache management.
eng/scripts/verify-cli-archive.ps1 Suppresses agent init when validating starter template generation.
eng/scripts/cli-starter-validation.ps1 Suppresses agent init when validating templates in PR-channel scenarios.
.agents/skills/aspireify/references/opentelemetry.md Removes embedded aspireify reference content (moved to external bundle).
.agents/skills/aspireify/references/javascript-apps.md Removes embedded aspireify reference content (moved to external bundle).
.agents/skills/aspireify/references/full-solution-apphosts.md Removes embedded aspireify reference content (moved to external bundle).
.agents/skills/aspireify/references/docker-compose.md Removes embedded aspireify reference content (moved to external bundle).
.agents/skills/aspire/SKILL.md Removes embedded aspire skill content (moved to external bundle).
.agents/skills/aspire/references/typescript-apphosts.md Removes embedded aspire reference content (moved to external bundle).
.agents/skills/aspire/references/tools-and-configuration.md Removes embedded aspire reference content (moved to external bundle).
.agents/skills/aspire/references/resource-management.md Removes embedded aspire reference content (moved to external bundle).
.agents/skills/aspire/references/playwright-handoff.md Removes embedded aspire reference content (moved to external bundle).
.agents/skills/aspire/references/monitoring.md Removes embedded aspire reference content (moved to external bundle).
.agents/skills/aspire/references/deployment.md Removes embedded aspire reference content (moved to external bundle).
.agents/skills/aspire/references/csharp-apphosts.md Removes embedded aspire reference content (moved to external bundle).
.agents/skills/aspire/references/app-commands.md Removes embedded aspire reference content (moved to external bundle).
.agents/skills/aspire/references/agent-workflows.md Removes embedded aspire reference content (moved to external bundle).
.agents/skills/aspire/evals/evals.json Removes embedded aspire eval assets (moved to external bundle / no longer embedded).
.agents/skills/aspire-deployment/SKILL.md Removes embedded deployment skill content (moved to external bundle).
.agents/skills/aspire-deployment/references/preflight.md Removes embedded deployment reference content (moved to external bundle).
.agents/skills/aspire-deployment/references/kubernetes.md Removes embedded deployment reference content (moved to external bundle).
.agents/skills/aspire-deployment/references/javascript.md Removes embedded deployment reference content (moved to external bundle).
.agents/skills/aspire-deployment/references/github-actions-azure-typescript.yml Removes embedded deployment reference content (moved to external bundle).
.agents/skills/aspire-deployment/references/github-actions-azure-csharp.yml Removes embedded deployment reference content (moved to external bundle).
.agents/skills/aspire-deployment/references/docker-compose.md Removes embedded deployment reference content (moved to external bundle).
.agents/skills/aspire-deployment/references/cicd.md Removes embedded deployment reference content (moved to external bundle).
.agents/skills/aspire-deployment/references/azure.md Removes embedded deployment reference content (moved to external bundle).
.agents/skills/aspire-deployment/references/aws.md Removes embedded deployment reference content (moved to external bundle).
Files not reviewed (1)
  • src/Aspire.Cli/Resources/AgentCommandStrings.Designer.cs: Language not supported

Comment thread tests/Aspire.Cli.Tests/Agents/AspireSkillsInstallerTests.cs Outdated
Comment thread tests/Aspire.Cli.Tests/Agents/AspireSkillsBundleTests.cs Outdated
Comment thread tests/Aspire.Cli.EndToEnd.Tests/AgentCommandTests.cs Outdated
Comment thread tests/Aspire.Cli.Tests/Agents/CommonAgentApplicatorsTests.cs
@adamint

Adam Ratzman (adamint) commented May 21, 2026

Copy link
Copy Markdown
Member

David Fowler (@davidfowl) If npm is not available, behavior depends on whether the Aspire skills bundle is already cached:

  • If the bundle is already in the CLI cache, aspire agent init can still install the Aspire skills without npm.
  • If this is the first install and there is no cached bundle, the CLI cannot resolve @microsoft/aspire-skills.

With the follow-up fix I pushed, direct aspire agent init stays strict: it shows the npm-required error and exits non-zero because the user explicitly asked to configure agent skills. The chained follow-up from aspire new / aspire init is best-effort: it shows a warning, skips the external Aspire skills, and keeps the primary command successful so app creation/init is not blocked by missing npm.

Playwright CLI already has similar optional behavior for missing npm: it reports the skill as skipped/informational rather than failing the entire flow.

If we want full first-install support without npm, we'd need a second distribution path for the skills bundle, such as a signed GitHub release/archive or some other non-npm bootstrap source.

To be honest, I really don't like the idea of requiring a dependency on npm for these. The whole point of the bundle in the first place was to avoid requiring a dependency on .NET. It feels like we're backsliding, especially since we've deemed skills very important? Just as JS devs would be confused about needing to install .NET, .NET devs (or python, java, etc.) devs would be confused about needing npm.

My vote would be to refactor

@mitchdenny

Copy link
Copy Markdown
Member

David Fowler (@davidfowl) Damian Edwards (@DamianEdwards) and I were discussing this. Rather than using NPM I think we should investigating downloading release metadata directly from the repo (for released builds we would same the use tag for the release of the aspire CLI). Then we would download the zip file containing the skills files, and then download the attestation bundle for that files' SHA and then use Sigstore to verify the provenance.

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.

Focused review - problems only.

Comment thread src/Aspire.Cli/Agents/AspireSkills/AspireSkillsInstaller.cs
Comment thread src/Aspire.Cli/Agents/AspireSkills/AspireSkillsInstaller.cs Outdated
@IEvangelist

Copy link
Copy Markdown
Member Author

Adam Ratzman (@adamint) Agreed, requiring npm as the first-install path is the wrong default here. I pushed 5d1e29587 to move this to a no-npm primary path while keeping the verification story intact.

The acquisition order is now: validated local cache first, then a GitHub release asset from microsoft/aspire-skills verified with GitHub artifact attestations/Sigstore for the downloaded asset SHA, then npm provenance/SRI if the GitHub release asset is unavailable, then detection of an already-installed agent-native Aspire skills plugin. So npm is now a fallback, not the required bootstrap path, and plugin managers are only the last fallback rather than the main mechanism.

@IEvangelist

Copy link
Copy Markdown
Member Author

Mitch Denny (@mitchdenny) I pushed 5d1e29587 in this direction. The GitHub path no longer uses raw tag archives; it reads release metadata, downloads a named release asset, computes the asset SHA-256, fetches the GitHub artifact attestation for that digest, and verifies it with Sigstore against microsoft/aspire-skills, the publish workflow, and the expected tag ref before caching anything.

npm provenance/SRI remains as the fallback when the GitHub release asset is unavailable, and plugin detection is the final fallback. That should preserve the no-npm path without regressing to unauthenticated GitHub archive downloads.

@IEvangelist

Copy link
Copy Markdown
Member Author

Sébastien Ros (@sebastienros) I couldn't attach inline replies to the two review comments through the REST endpoint, but both are fixed in 5d1e29587:

  • For Migrate Aspire skills to external bundle #17323 (comment), TouchLastUsed is now best-effort and only logs IOException/UnauthorizedAccessException, so a readable and validated cached bundle is still used if updating .lastused fails.
  • For Migrate Aspire skills to external bundle #17323 (comment), stale cache cleanup now catches/logs failures per cache entry, so an unreadable or concurrently removed old cache entry cannot fail the current install. I also added a per-version cache lock around the final cache move so concurrent first installs do not delete/replace each other.

@mitchdenny

Copy link
Copy Markdown
Member

npm provenance/SRI remains as the fallback when the GitHub release asset is unavailable, and plugin detection is the final fallback. That should preserve the no-npm path without regressing to unauthenticated GitHub archive downloads.

But where is the NPM artifact coming from, we wouldn't be publishing an aspire skills artifact to NPM in this case???

@IEvangelist

Copy link
Copy Markdown
Member Author

npm provenance/SRI remains as the fallback when the GitHub release asset is unavailable, and plugin detection is the final fallback. That should preserve the no-npm path without regressing to unauthenticated GitHub archive downloads.

But where is the NPM artifact coming from, we wouldn't be publishing an aspire skills artifact to NPM in this case???

The repo: npx skills add

https://www.skills.sh/

@IEvangelist

Copy link
Copy Markdown
Member Author

Adam Ratzman (@adamint) Mitch Denny (@mitchdenny) quick correction to my earlier replies after the latest design decision: I pushed ea4aebc41 to simplify this further. Aspire skills acquisition is now only validated cache first, then verified GitHub release asset download with GitHub artifact attestation/Sigstore before caching. There is no npm/npx fallback and no agent plugin-manager detection fallback for Aspire skills.

@IEvangelist

Copy link
Copy Markdown
Member Author

PR Testing Report

Result: ⚠️ Partially verified; external Aspire skills bundle download failed as expected for now because the skills repo/release is not yet public/published.

PR Information

  • PR: Migrate Aspire skills to external bundle #17323 — Migrate Aspire skills to external bundle
  • Head commit tested: ea4aebc41ae0ab2c354183be8df354752cf12839
  • Installed CLI: 13.4.0-pr.17323.gea4aebc4
  • Version verification: ✅ Installed dogfood CLI matched the PR head short SHA

Scenarios Tested

Scenario Status Notes
PR CLI install/version check ✅ Passed Dogfood CLI installed locally in an isolated temp path.
aspire new aspire-starter --suppress-agent-init ✅ Passed Project creation succeeded using the PR hive/version.
aspire agent init with aspire,aspireify,aspire-deployment ⚠️ Expected failure External skills bundle download failed because the release/repo is not currently public/published.
aspire agent init --skill-locations none --skills none ✅ Passed No-skill path completed successfully.
aspire mcp init smoke ⚠️ Expected failure Deprecated hidden init path reaches the same external skills bundle download path.

External Bundle Failure Evidence

The CLI attempted to resolve the configured skills bundle version from:

https://api.github.com/repos/microsoft/aspire-skills/releases/tags/v0.0.1
https://api.github.com/repos/microsoft/aspire-skills/releases/tags/0.0.1

Both returned 404, then the CLI reported:

Aspire skills could not be downloaded from the verified GitHub release asset, and no valid cached bundle is available.

Per follow-up context, this is expected at this stage because the external skills repository/release has not been published publicly yet.

Overall

The PR dogfood CLI installs correctly and normal project creation with agent init suppressed works. The no-skill agent init path also works. The only failures observed are tied to the intentionally unavailable external skills bundle.

Copilot AI and others added 8 commits May 26, 2026 07:55
Move Aspire workflow skill installation off embedded resources and add a verified cached Aspire skills bundle resolver.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep direct aspire agent init strict when the external Aspire skills bundle cannot be resolved, but allow follow-up agent init from aspire new/init to continue after showing a warning and dropping the unavailable external skills.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Avoid exercising external Aspire skills while testing deprecated config migration, and seed the Aspire skills cache for the E2E scenario that verifies default skill installation before the package is published.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Treat omitted optional path arrays in the external Aspire skills bundle manifest as empty, and report required missing file arrays as invalid manifests instead of throwing a null reference during skill installation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
David Pine (IEvangelist) and others added 3 commits May 26, 2026 07:55
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Make Aspire skills acquisition cache-first, then GitHub release assets verified through artifact attestations, with npm provenance/SRI and plugin detection fallbacks. Also make cache marker writes and stale cache cleanup best-effort.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep Aspire skills acquisition to cache first, then verified GitHub release assets. Remove npm and agent plugin fallback paths so unavailable GitHub acquisition fails clearly unless a valid cache entry exists.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@IEvangelist
David Pine (IEvangelist) force-pushed the dapine/skills-delegation-plan branch from ea4aebc to 489c781 Compare May 26, 2026 12:57
Quarantine LogLevelTrace_ProducesTraceEntriesInCliLogFile because it intermittently hangs after aspire stop fails during CLI E2E runs.

Issue: #17485

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@IEvangelist
David Pine (IEvangelist) enabled auto-merge (squash) May 26, 2026 20:49
@IEvangelist
David Pine (IEvangelist) merged commit ac9cfa7 into main May 26, 2026
916 of 924 checks passed
@IEvangelist
David Pine (IEvangelist) deleted the dapine/skills-delegation-plan branch May 26, 2026 20:58
@microsoft-github-policy-service microsoft-github-policy-service Bot added this to the 13.4 milestone May 26, 2026
@github-actions

Copy link
Copy Markdown
Contributor

CLI E2E Tests failed — 105 passed, 1 failed, 2 unknown (commit 971ff5a)

Failed Tests

View all recordings
Status Test Recording
AddPackageInteractiveWhileAppHostRunningDetached ▶️ View recording
AddPackageWhileAppHostRunningDetached ▶️ View recording
AgentCommands_AllHelpOutputs_AreCorrect ▶️ View recording
AgentInitCommand_DefaultSelection_InstallsDefaultSkills ▶️ View recording
AgentInitCommand_MigratesDeprecatedConfig ▶️ View recording
AgentMcpListStructuredLogsReturnsLogsFromStarterApp ▶️ View recording
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_DevLocalhost ▶️ View recording
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_Isolated ▶️ View recording
AllPublishMethodsBuildDockerImages ▶️ View recording
AspireAddPackageVersionToDirectoryPackagesProps ▶️ View recording
AspireInitSingleFileAppHostRunsViaDotnetRunAppHost ▶️ View recording
AspireInitWithExistingAppHostDirRecreatesMissingNuGetConfigAndPreservesFiles ▶️ View recording
AspireInitWithSolutionFileGeneratesAppHostThatBuildsAgainstChannelHive ▶️ View recording
AspireStartUpdatesStaleTypeScriptAppHostPath ▶️ View recording
AspireUpdateRemovesAppHostPackageVersionFromDirectoryPackagesProps ▶️ View recording
AspireUpdateRemovesOrphanAppHostPackageVersionWhenSdkAlreadyCurrent ▶️ View recording
Banner_DisplayedOnFirstRun ▶️ View recording
Banner_DisplayedWithExplicitFlag ▶️ View recording
Banner_NotDisplayedWithNoLogoFlag ▶️ View recording
CertificatesClean_RemovesCertificates ▶️ View recording
CertificatesTrust_WithNoCert_CreatesAndTrustsCertificate ▶️ View recording
CertificatesTrust_WithUntrustedCert_TrustsCertificate ▶️ View recording
ConfigSetGet_CreatesNestedJsonFormat ▶️ View recording
CreateAndRunAspireStarterProject ▶️ View recording
CreateAndRunAspireStarterProjectWithBundle ▶️ View recording
CreateAndRunEmptyAppHostProject ▶️ View recording
CreateAndRunJavaEmptyAppHostProject ▶️ View recording
CreateAndRunJsReactProject ▶️ View recording
CreateAndRunPythonReactProject ▶️ View recording
CreateAndRunTypeScriptEmptyAppHostProject ▶️ View recording
CreateAndRunTypeScriptStarterProject ▶️ View recording
CreateJavaAppHostWithViteApp ▶️ View recording
CreateTypeScriptAppHostWithViteApp_UsesConfiguredToolchain ▶️ View recording
DashboardRunWithAgentMcpListTracesReturnsNoTraces ▶️ View recording
DashboardRunWithAgentMcpListTracesReturnsNoTraces_DevLocalhost ▶️ View recording
DashboardRunWithOtelTracesReturnsNoTraces ▶️ View recording
DashboardRunWithOtelTracesReturnsNoTraces_DevLocalhost ▶️ View recording
DeployK8sBasicApiService ▶️ View recording
DeployK8sWithExternalHelmChart ▶️ View recording
DeployK8sWithGarnet ▶️ View recording
DeployK8sWithMongoDB ▶️ View recording
DeployK8sWithMySql ▶️ View recording
DeployK8sWithPostgres ▶️ View recording
DeployK8sWithRabbitMQ ▶️ View recording
DeployK8sWithRedis ▶️ View recording
DeployK8sWithSqlServer ▶️ View recording
DeployK8sWithValkey ▶️ View recording
DeployTypeScriptAppToKubernetes ▶️ View recording
DescribeCommandResolvesReplicaNames ▶️ View recording
DescribeCommandShowsRunningResources ▶️ View recording
DetachFormatJsonProducesValidJson ▶️ View recording
DetachFormatJsonProducesValidJsonWhenRestartingExistingInstance ▶️ View recording
DoListStepsShowsPipelineSteps ▶️ View recording
DocsCommand_RendersInteractiveMarkdownFromLocalSource ▶️ View recording
DoctorCommand_DetectsDeprecatedAgentConfig ▶️ View recording
DoctorCommand_TypeScriptAppHostReportsMissingConfiguredToolchain ▶️ View recording
DoctorCommand_WithSslCertDir_ShowsTrusted ▶️ View recording
DoctorCommand_WithoutSslCertDir_ShowsPartiallyTrusted ▶️ View recording
GatewayWithoutExternalEndpoint_FailsPublishWithGuidance ▶️ View recording
GeneratedAspireDevScript_StartsWatchMode_WithConfiguredToolchain ▶️ View recording
GlobalMigration_HandlesCommentsAndTrailingCommas ▶️ View recording
GlobalMigration_HandlesMalformedLegacyJson ▶️ View recording
GlobalMigration_PreservesAllValueTypes ▶️ View recording
GlobalMigration_SkipsWhenNewConfigExists ▶️ View recording
GlobalSettings_MigratedFromLegacyFormat ▶️ View recording
IngressWithoutExternalEndpoint_FailsPublishWithGuidance ▶️ View recording
InitTypeScriptAppHost_AugmentsExistingViteRepoAtRoot ▶️ View recording
InteractiveCSharpInitCreatesExpectedFiles ▶️ View recording
InvalidAppHostPathWithComments_IsHealedOnRun ▶️ View recording
JavaScriptHostingApisRunFromTypeScriptAppHost ▶️ View recording
LatestCliCanStartStableChannelAppHost ▶️ View recording
LatestCliCanStartStableChannelTypeScriptAppHost ▶️ View recording
LegacySettingsMigration_AdjustsRelativeAppHostPath ▶️ View recording
LogsCommandShowsResourceLogs ▶️ View recording
OtelLogsReturnsStructuredLogsFromStarterApp ▶️ View recording
OtelLogsReturnsStructuredLogsFromStarterAppIsolated ▶️ View recording
PsCommandListsRunningAppHost ▶️ View recording
PsFormatJsonOutputsOnlyJsonToStdout ▶️ View recording
PublishJavaScriptPatternsGeneratesExpectedDockerComposeArtifacts ▶️ View recording
PublishWithConfigureEnvFileUpdatesEnvOutput ▶️ View recording
PublishWithDockerComposeServiceCallbackSucceeds ▶️ View recording
PublishWithoutOutputPathUsesAppHostDirectoryDefault ▶️ View recording
ResourceCommand_FailedExecution_DisplaysAppHostLogPathAndLogContainsEntries ▶️ View recording
ResourceCommand_FailsWhenInteractionServiceIsRequired ▶️ View failure recording
ResourceCommand_SetAndDeleteParameterUpdatesDescribeOutput ▶️ View recording
RestoreGeneratesSdkFiles ▶️ View recording
RestoreGeneratesSdkFiles_WithConfiguredToolchain ▶️ View recording
RestoreRefreshesGeneratedSdkAfterAddingIntegration ▶️ View recording
RestoreSupportsConfigOnlyHelperPackageAndCrossPackageTypes ▶️ View recording
RunFromParentDirectory_UsesExistingConfigNearAppHost ▶️ View recording
RunReportsSyntaxErrorsForDotNetAppHost ▶️ View recording
RunReportsSyntaxErrorsForTypeScriptAppHost ▶️ View recording
SecretCrudOnDotNetAppHost ▶️ View recording
SecretCrudOnTypeScriptAppHost ▶️ View recording
StagingChannel_ConfigureAndVerifySettings_ThenSwitchChannels ▶️ View recording
StartAndWaitForTypeScriptSqlServerAppHostWithNativeAssets ▶️ View recording
StartReportsSyntaxErrorsForDotNetAppHost ▶️ View recording
StartReportsSyntaxErrorsForTypeScriptAppHost ▶️ View recording
StopAllAppHostsFromAppHostDirectory ▶️ View recording
StopJavaPolyglotAppHostUsingApphostDirectory ▶️ View recording
StopNonInteractiveSingleAppHost ▶️ View recording
StopTypeScriptPolyglotAppHostUsingApphostDirectory ▶️ View recording
StopWithNoRunningAppHostExitsSuccessfully ▶️ View recording
UnAwaitedChainsCompileWithAutoResolvePromises ▶️ View recording
UpdateProjectChannelToStable_CSharpEmptyAppHost_PreservesAspireConfigChannel ▶️ View recording
UpdateProjectChannelToStable_CSharpSingleFileInit_PreservesAspireConfigChannel ▶️ View recording
UpdateProjectChannelToStable_TypeScriptSingleFileInit_PreservesAspireConfigChannel ▶️ View recording
UpdateProjectChannelToStable_TypeScript_PreviewsStablePackagesAndPreservesChannel ▶️ View recording

📹 Recordings uploaded automatically from CI run #26462076310

aspire-repo-bot Bot added a commit to microsoft/aspire.dev that referenced this pull request May 26, 2026
The aspire, aspireify, and aspire-deployment skills are now fetched
from the external @microsoft/aspire-skills npm bundle instead of
being embedded in the CLI. Document the network access requirement,
cache location, and the unchanged install command.

Documents changes from microsoft/aspire#17323.

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

Copy link
Copy Markdown
Contributor

Pull request created: #1077

Generated by PR Documentation Check

@aspire-repo-bot

Copy link
Copy Markdown
Contributor

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

A draft docs PR has been opened against release/13.4 on microsoft/aspire.dev documenting the migration of Aspire workflow skills to an external npm bundle (@microsoft/aspire-skills).

Triggered signals and evidence:

  • cli_command_file_changed: src/Aspire.Cli/Commands/AgentCommand.cs was modified — adds aspireify and aspire-deployment skills from the external bundle
  • cli_resource_strings_changed: src/Aspire.Cli/Resources/AgentCommandStrings.resx was modified — new skill names and option descriptions added
  • pr_body_has_user_facing_section: PR body contains a ## Usage section describing external bundle behavior and --skills flag examples
  • pr_body_has_cli_flag_mention: PR body references --skills aspire --skills aspireify --skills aspire-deployment

Docs changes:

  • aspire-agent-init.mdx: added aspireify/aspire-deployment to skill list, added npm bundle note with Windows/Linux/macOS cache paths, updated --skills option description and example
  • ai-coding-agents.mdx: added new skills to skill list, added network-access callout
  • aspire-13-4.mdx: updated CLI bullet and added "Aspire workflow skills from external bundle" subsection

Note

This draft PR needs human review before merging.

@IEvangelist

Copy link
Copy Markdown
Member Author

/backport to release/13.4

@github-actions

Copy link
Copy Markdown
Contributor

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

@aspire-repo-bot

Copy link
Copy Markdown
Contributor

David Pine (@IEvangelist) backporting to release/13.4 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patch

Applying: Migrate Aspire skills to external bundle
Using index info to reconstruct a base tree...
A	.agents/skills/aspire-deployment/SKILL.md
A	.agents/skills/aspire-deployment/references/aws.md
A	.agents/skills/aspire-deployment/references/azure.md
A	.agents/skills/aspire-deployment/references/cicd.md
A	.agents/skills/aspire-deployment/references/docker-compose.md
A	.agents/skills/aspire-deployment/references/github-actions-azure-csharp.yml
A	.agents/skills/aspire-deployment/references/github-actions-azure-typescript.yml
A	.agents/skills/aspire-deployment/references/javascript.md
A	.agents/skills/aspire-deployment/references/kubernetes.md
A	.agents/skills/aspire-deployment/references/preflight.md
A	.agents/skills/aspire/SKILL.md
A	.agents/skills/aspire/evals/evals.json
A	.agents/skills/aspire/references/agent-workflows.md
A	.agents/skills/aspire/references/app-commands.md
A	.agents/skills/aspire/references/csharp-apphosts.md
A	.agents/skills/aspire/references/deployment.md
A	.agents/skills/aspire/references/monitoring.md
A	.agents/skills/aspire/references/playwright-handoff.md
A	.agents/skills/aspire/references/resource-management.md
A	.agents/skills/aspire/references/tools-and-configuration.md
A	.agents/skills/aspire/references/typescript-apphosts.md
A	.agents/skills/aspireify/SKILL.md
A	.agents/skills/aspireify/references/apphost-wiring.md
A	.agents/skills/aspireify/references/docker-compose.md
A	.agents/skills/aspireify/references/full-solution-apphosts.md
A	.agents/skills/aspireify/references/javascript-apps.md
A	.agents/skills/aspireify/references/opentelemetry.md
M	src/Aspire.Cli/Agents/CommonAgentApplicators.cs
A	src/Aspire.Cli/Agents/EmbeddedSkillResourceLoader.cs
M	src/Aspire.Cli/Agents/SkillDefinition.cs
M	src/Aspire.Cli/Aspire.Cli.csproj
M	src/Aspire.Cli/Commands/AgentInitCommand.cs
M	src/Aspire.Cli/Commands/McpInitCommand.cs
M	src/Aspire.Cli/Program.cs
M	src/Aspire.Cli/Resources/AgentCommandStrings.Designer.cs
M	src/Aspire.Cli/Resources/AgentCommandStrings.resx
M	src/Aspire.Cli/Resources/xlf/AgentCommandStrings.cs.xlf
M	src/Aspire.Cli/Resources/xlf/AgentCommandStrings.de.xlf
M	src/Aspire.Cli/Resources/xlf/AgentCommandStrings.es.xlf
M	src/Aspire.Cli/Resources/xlf/AgentCommandStrings.fr.xlf
M	src/Aspire.Cli/Resources/xlf/AgentCommandStrings.it.xlf
M	src/Aspire.Cli/Resources/xlf/AgentCommandStrings.ja.xlf
M	src/Aspire.Cli/Resources/xlf/AgentCommandStrings.ko.xlf
M	src/Aspire.Cli/Resources/xlf/AgentCommandStrings.pl.xlf
M	src/Aspire.Cli/Resources/xlf/AgentCommandStrings.pt-BR.xlf
M	src/Aspire.Cli/Resources/xlf/AgentCommandStrings.ru.xlf
M	src/Aspire.Cli/Resources/xlf/AgentCommandStrings.tr.xlf
M	src/Aspire.Cli/Resources/xlf/AgentCommandStrings.zh-Hans.xlf
M	src/Aspire.Cli/Resources/xlf/AgentCommandStrings.zh-Hant.xlf
M	tests/Aspire.Cli.Tests/Agents/CommonAgentApplicatorsTests.cs
M	tests/Aspire.Cli.Tests/Commands/AgentInitCommandTests.cs
M	tests/Aspire.Cli.Tests/TestServices/FakePlaywrightServices.cs
M	tests/Aspire.Cli.Tests/Utils/CliTestHelper.cs
Falling back to patching base and 3-way merge...
Auto-merging src/Aspire.Cli/Agents/AspireSkills/AspireSkillsBundle.cs
CONFLICT (add/add): Merge conflict in src/Aspire.Cli/Agents/AspireSkills/AspireSkillsBundle.cs
Auto-merging src/Aspire.Cli/Agents/AspireSkills/AspireSkillsInstaller.cs
CONFLICT (add/add): Merge conflict in src/Aspire.Cli/Agents/AspireSkills/AspireSkillsInstaller.cs
Auto-merging src/Aspire.Cli/Agents/AspireSkills/SkillBundleManifest.cs
CONFLICT (add/add): Merge conflict in src/Aspire.Cli/Agents/AspireSkills/SkillBundleManifest.cs
Auto-merging src/Aspire.Cli/Aspire.Cli.csproj
Auto-merging src/Aspire.Cli/Commands/AgentInitCommand.cs
CONFLICT (content): Merge conflict in src/Aspire.Cli/Commands/AgentInitCommand.cs
Auto-merging src/Aspire.Cli/Program.cs
CONFLICT (content): Merge conflict in src/Aspire.Cli/Program.cs
Auto-merging src/Aspire.Cli/Resources/AgentCommandStrings.Designer.cs
CONFLICT (content): Merge conflict in src/Aspire.Cli/Resources/AgentCommandStrings.Designer.cs
Auto-merging src/Aspire.Cli/Resources/AgentCommandStrings.resx
CONFLICT (content): Merge conflict in src/Aspire.Cli/Resources/AgentCommandStrings.resx
Auto-merging src/Aspire.Cli/Resources/xlf/AgentCommandStrings.cs.xlf
CONFLICT (content): Merge conflict in src/Aspire.Cli/Resources/xlf/AgentCommandStrings.cs.xlf
Auto-merging src/Aspire.Cli/Resources/xlf/AgentCommandStrings.de.xlf
CONFLICT (content): Merge conflict in src/Aspire.Cli/Resources/xlf/AgentCommandStrings.de.xlf
Auto-merging src/Aspire.Cli/Resources/xlf/AgentCommandStrings.es.xlf
CONFLICT (content): Merge conflict in src/Aspire.Cli/Resources/xlf/AgentCommandStrings.es.xlf
Auto-merging src/Aspire.Cli/Resources/xlf/AgentCommandStrings.fr.xlf
CONFLICT (content): Merge conflict in src/Aspire.Cli/Resources/xlf/AgentCommandStrings.fr.xlf
Auto-merging src/Aspire.Cli/Resources/xlf/AgentCommandStrings.it.xlf
CONFLICT (content): Merge conflict in src/Aspire.Cli/Resources/xlf/AgentCommandStrings.it.xlf
Auto-merging src/Aspire.Cli/Resources/xlf/AgentCommandStrings.ja.xlf
CONFLICT (content): Merge conflict in src/Aspire.Cli/Resources/xlf/AgentCommandStrings.ja.xlf
Auto-merging src/Aspire.Cli/Resources/xlf/AgentCommandStrings.ko.xlf
CONFLICT (content): Merge conflict in src/Aspire.Cli/Resources/xlf/AgentCommandStrings.ko.xlf
Auto-merging src/Aspire.Cli/Resources/xlf/AgentCommandStrings.pl.xlf
CONFLICT (content): Merge conflict in src/Aspire.Cli/Resources/xlf/AgentCommandStrings.pl.xlf
Auto-merging src/Aspire.Cli/Resources/xlf/AgentCommandStrings.pt-BR.xlf
CONFLICT (content): Merge conflict in src/Aspire.Cli/Resources/xlf/AgentCommandStrings.pt-BR.xlf
Auto-merging src/Aspire.Cli/Resources/xlf/AgentCommandStrings.ru.xlf
CONFLICT (content): Merge conflict in src/Aspire.Cli/Resources/xlf/AgentCommandStrings.ru.xlf
Auto-merging src/Aspire.Cli/Resources/xlf/AgentCommandStrings.tr.xlf
CONFLICT (content): Merge conflict in src/Aspire.Cli/Resources/xlf/AgentCommandStrings.tr.xlf
Auto-merging src/Aspire.Cli/Resources/xlf/AgentCommandStrings.zh-Hans.xlf
CONFLICT (content): Merge conflict in src/Aspire.Cli/Resources/xlf/AgentCommandStrings.zh-Hans.xlf
Auto-merging src/Aspire.Cli/Resources/xlf/AgentCommandStrings.zh-Hant.xlf
CONFLICT (content): Merge conflict in src/Aspire.Cli/Resources/xlf/AgentCommandStrings.zh-Hant.xlf
Auto-merging tests/Aspire.Cli.Tests/Agents/AspireSkillsBundleTests.cs
CONFLICT (add/add): Merge conflict in tests/Aspire.Cli.Tests/Agents/AspireSkillsBundleTests.cs
Auto-merging tests/Aspire.Cli.Tests/Agents/AspireSkillsInstallerTests.cs
CONFLICT (add/add): Merge conflict in tests/Aspire.Cli.Tests/Agents/AspireSkillsInstallerTests.cs
Auto-merging tests/Aspire.Cli.Tests/Commands/AgentInitCommandTests.cs
Auto-merging tests/Aspire.Cli.Tests/TestServices/FakePlaywrightServices.cs
CONFLICT (content): Merge conflict in tests/Aspire.Cli.Tests/TestServices/FakePlaywrightServices.cs
error: Failed to merge in the changes.
hint: Use 'git am --show-current-patch=diff' to see the failed patch
hint: When you have resolved this problem, run "git am --continue".
hint: If you prefer to skip this patch, run "git am --skip" instead.
hint: To restore the original branch and stop patching, run "git am --abort".
hint: Disable this message with "git config set advice.mergeConflict false"
Patch failed at 0001 Migrate Aspire skills to external bundle
Error: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

@github-actions

Copy link
Copy Markdown
Contributor

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

@aspire-repo-bot

Copy link
Copy Markdown
Contributor

David Pine (@IEvangelist) an error occurred while backporting to release/13.4. See the workflow output for details.

David Pine (IEvangelist) added a commit to microsoft/aspire.dev that referenced this pull request Jun 1, 2026
#1077)

* docs: document Aspire workflow skills external bundle migration

The aspire, aspireify, and aspire-deployment skills are now fetched
from the external @microsoft/aspire-skills npm bundle instead of
being embedded in the CLI. Document the network access requirement,
cache location, and the unchanged install command.

Documents changes from microsoft/aspire#17323.

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

* Address review feedback (8 threads)

- Replace npm-bundle wording with GitHub release asset wording (PRRT_kwDOQK_VN86Fti2p, PRRT_kwDOQK_VN86Fti2r, PRRT_kwDOQK_VN86Fti22)

- Correct attestation, manifest-hash, and unsafe-path verification wording (PRRT_kwDOQK_VN86Fti2r, PRRT_kwDOQK_VN86Fti24)

- Clarify skill defaults and Playwright network requirements (PRRT_kwDOQK_VN86Fti2v, PRRT_kwDOQK_VN86Fti2z)

- Fix the Linux/macOS cache path typo (PRRT_kwDOQK_VN86E7uL1, PRRT_kwDOQK_VN86Fti27)

Verified against microsoft/aspire@565af53 on branch release/13.4.

Edited per the doc-writer skill.

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

* Consolidate Aspire AI skills docs

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

* Fix agent init output summary docs

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

---------

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants