[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M699ZX7MB06VVDN5Y9N7BDP2":3,"skill-same:01M699ZX7MB06VVDN5Y9N7BDP2":112},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":56,"commitSha":57,"skillDirectory":58,"forksCount":59,"repositoryHtmlUrl":60,"repositoryHomepageUrl":61,"ownerHtmlUrl":62,"ownerBlogUrl":63,"ownerDescription":64,"updatedAt":65,"install":66,"resources":79},"01M699ZX7MB06VVDN5Y9N7BDP2","aspire-orchestration",null,"**WORKFLOW SKILL** — Manage Aspire lifecycle in VS Code or the CLI. WHEN: \"start or stop my Aspire app\", \"aspire_apphost_start\", \"aspire_apphost_stop\", \"notEditorOwned\", \"ambiguousSession\", \"aspire start\", \"aspire stop\", \"aspire wait\", resource restart, file-lock errors (MSB3491 or CS2012), port conflicts, git worktrees, \"--isolated\", \"aspire update --self\", \"aspire update --migrate\", \"aspire describe --include-hidden\", \"aspire stop --force\", \"aspire stop --force --volumes\", integration discovery, default watch, or hot reload. INVOKES: VS Code lifecycle tools first when exposed; Aspire CLI for readiness, inspection, resource operations, isolated worktree starts, and allowed fallbacks. DO NOT USE FOR: deploy\u002Fpublish\u002Fdestroy (aspire-deployment), logs\u002Ftraces\u002Fmetrics (aspire-monitoring), terminal authoring\u002Fattach\u002Ftapes (aspire-terminals), or AppHost code and resource wiring (aspireify). FOR SINGLE OPERATIONS: Load the matching editor tool first; follow exact-target, worktree-isolation, and stop-result rules.","microsoft\u002Faspire-skills","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M699Z09A17E8C731AGNTAEVR",94,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fskills\u002Faspire-orchestration\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"aspire orchestration","orchestration","aspire","attach","port","conflicts","self","publish","lock","monitoring","logs","git worktrees","code","migrate","errors","default","workflow skill","app","workflow","aspireify","2026-11-10 10:12:30",false,"---\nname: aspire-orchestration\ndescription: >-\n  **WORKFLOW SKILL** — Manage Aspire lifecycle in VS Code or the CLI.\n  WHEN: \"start or stop my Aspire app\", \"aspire_apphost_start\",\n  \"aspire_apphost_stop\", \"notEditorOwned\", \"ambiguousSession\", \"aspire start\",\n  \"aspire stop\", \"aspire wait\", resource restart, file-lock errors (MSB3491 or\n  CS2012), port conflicts, git worktrees, \"--isolated\", \"aspire update --self\",\n  \"aspire update --migrate\", \"aspire describe --include-hidden\", \"aspire stop --force\",\n  \"aspire stop --force --volumes\", integration discovery, default watch, or hot reload.\n  INVOKES: VS Code lifecycle tools first when exposed; Aspire CLI for readiness,\n  inspection, resource operations, isolated worktree starts, and allowed fallbacks.\n  DO NOT USE FOR: deploy\u002Fpublish\u002Fdestroy (aspire-deployment), logs\u002Ftraces\u002Fmetrics\n  (aspire-monitoring), terminal authoring\u002Fattach\u002Ftapes (aspire-terminals), or\n  AppHost code and resource wiring (aspireify).\n  FOR SINGLE OPERATIONS: Load the matching editor tool first; follow exact-target,\n  worktree-isolation, and stop-result rules.\nlicense: MIT\nmetadata:\n  author: Microsoft\n  version: \"0.0.5\"\n---\n\n# Aspire Orchestration\n\n> **MANDATORY COMPLIANCE** — This skill prevents agent self-harm in Aspire projects.\n> Violating these rules causes file locks, orphaned processes, and user frustration ([#15801](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fissues\u002F15801)).\n\n## Prerequisites\n\n| Requirement | Install |\n|-------------|---------|\n| .NET 10.0 SDK | https:\u002F\u002Fdotnet.microsoft.com\u002Fdownload |\n| Aspire CLI (curl\u002FPowerShell) | `curl -sSL https:\u002F\u002Faspire.dev\u002Finstall.sh \\| bash` |\n| Aspire CLI (npm) | `npm install -g @microsoft\u002Faspire-cli` |\n| Aspire CLI (NativeAOT global tool, .NET 10) | `dotnet tool install -g Aspire.Cli` |\n\nUse the installation method owned by the user's environment. npm, Nix, Homebrew, WinGet,\nmise, and the install scripts are supported alongside the NativeAOT .NET global tool.\n\n## Detection\n\nActivate when ANY signal is present:\n\n| Signal | How to Detect | Confidence |\n|--------|---------------|------------|\n| C# AppHost | `.csproj` containing `Aspire.AppHost.Sdk` | ✅ Definitive |\n| File-based C# AppHost | `apphost.cs` or `.cs` file with `#:sdk Aspire.AppHost.Sdk` | ✅ Definitive |\n| TypeScript AppHost | Current `apphost.mts` or legacy `apphost.ts` file in project | ✅ Definitive |\n| Aspire config | `aspire.config.json` in project root | High |\n| Aspire settings | `.aspire\u002F` directory present | High |\n| Generated TS modules | `.aspire\u002Fmodules\u002F` directory present | High |\n| Service defaults | `\u003CIsAspireSharedProject>true` or a `*.ServiceDefaults.csproj` project reference | Medium |\n\nSee [detection.md](references\u002Fdetection.md) for detailed fingerprinting.\n\n## VS Code AppHost Lifecycle\n\nWhen the agent host exposes `aspire_apphost_start` or `aspire_apphost_stop`, use the\nmatching tool before running `aspire start` or `aspire stop` in a terminal, except when\nstarting from a git worktree requires `--isolated` and the tool cannot request it. If the\ntool is listed as deferred, load its contract with the host's tool-discovery mechanism\nfirst; do not treat an unloaded deferred tool as unavailable.\n\nPass the exact selected `appHostPath` discovered by Aspire to editor lifecycle tools. In a\nmulti-root workspace, that tool contract may require a selector such as\n`repo-a~1\u002FMyApp.AppHost\u002FMyApp.AppHost.csproj`.\n\nThe CLI `--apphost` flag does not understand that selector namespace. Before any CLI\nstart\u002Fstop fallback, resolve the selected AppHost to its actual filesystem project path\nand pass that path to `--apphost`; never copy a multi-root selector verbatim. That CLI\nproject path may be workspace-relative (`MyApp.AppHost\u002FMyApp.AppHost.csproj`) or\nabsolute (`\u002Fworkspaces\u002Frepo-a\u002FMyApp.AppHost\u002FMyApp.AppHost.csproj` or\n`C:\\workspaces\\repo-a\\MyApp.AppHost\\MyApp.AppHost.csproj`); use the current platform's\nnative path syntax. If several AppHosts are discovered and the user's target is unclear,\nask which one to use instead of guessing, invoking the tool for every AppHost, or\nissuing an unscoped CLI command.\n\nIf the selected `appHostPath` is already a normal workspace-relative project path such\nas `MyApp.AppHost\u002FMyApp.AppHost.csproj`, reuse it unchanged for CLI fallbacks; do not\nconvert it to an absolute path just for the CLI.\n\n**An unclear target is a hard stop.** Ask one clarifying question and wait for the user to\nname an AppHost. Do not call a lifecycle tool or terminal command until the target is\nresolved, and do not offer commands that bypass this gate. Stop multiple AppHosts only\nwhen the user explicitly requests all of them.\n\nFor starts, call `aspire_apphost_start` with mode `run` and the exact selected\n`appHostPath` unless the user explicitly asks to attach a debugger. In a git worktree, the\neditor tool does not currently request Aspire's isolated state. Resolve the selected\nAppHost to its filesystem path and use\n`aspire start --non-interactive --isolated --apphost \u003Cfilesystem-path>` instead.\n\n`run` mode has no debugger attached, but it still has an editor-owned Aspire session that\n`aspire_apphost_stop` can stop. After a stop call, follow this result matrix exactly:\n\n| Tool result | Next action | CLI stop allowed? |\n|-------------|-------------|-------------------|\n| `stopped` or `notRunning` | Report the result; take no further stop action | No |\n| `alreadyStopping`, controller `editor` | Report that the editor stop is already in progress; take no further stop action | No |\n| `alreadyStarting`, controller `editor` | Retry `aspire_apphost_stop` once; if it repeats, report that startup is still in progress and take no further stop action | No |\n| `notEditorOwned`, controller `external` | If the user requested that exact AppHost be stopped, resolve it to its filesystem path and run `aspire stop --non-interactive --apphost \u003Cfilesystem-path>` | Yes |\n| `failed`, controller `unknown` | Retry `aspire_apphost_stop` once; if the same result repeats, use the same exact-target CLI command above | Only after the retry |\n| `ambiguousSession` | Stop nothing and have the user disambiguate in the editor | **Never** |\n| Any other refusal or failure | Resolve or report that result; do not change mechanisms | No |\n\nThe rows are mutually exclusive. Act only on the current result; do not offer a command\nfrom another row as a speculative future workaround. Re-evaluate only after a new tool\nresult is returned.\n\n**`ambiguousSession` is a terminal safety refusal.** Do not run or offer a CLI fallback,\nand do not ask whether the user wants one. User confirmation cannot make an ambiguous\neditor session safe to terminate from the CLI.\n\nUse direct Aspire CLI lifecycle commands only when the matching editor tool is unavailable,\nfor isolated worktree starts, or for a stop result explicitly marked as allowed above.\nWhen a CLI fallback is allowed, keep the target exact by resolving the selected AppHost to\nits filesystem path first.\n\n## Safety Guardrails\n\n| Situation | ✅ ALWAYS Do | ❌ NEVER Do |\n|-----------|-------------|------------|\n| Start an Aspire app | `aspire_apphost_start` with mode `run` and the exact selected `appHostPath` when available; in a git worktree, use `aspire start --non-interactive --isolated --apphost \u003Cfilesystem-path>` even when `aspire_apphost_start` is available | `dotnet run` on AppHost |\n| Wait for resource ready | `aspire wait \u003Cresource>` | `curl` \u002F HTTP polling loops |\n| Code changed in a resource | Prefer resource commands, runtime watch\u002FHMR, dashboard actions, or IDE-managed debugging | `dotnet build` against locked files |\n| Task complete | `aspire_apphost_stop` with the exact selected `appHostPath` when available; follow its result matrix | Use an unapproved CLI fallback |\n| Check running AppHosts | `aspire ps` | Manual process inspection |\n| Check resource status | `aspire describe` | `aspire ps --resources` (removed in 13.5) |\n| Remove persistent resources | Confirm the exact AppHost and that its persistent resource instances will be removed before `aspire stop --force --apphost \u003Cfilesystem-path>`; explain that `--force` alone preserves persistent volumes | Combining `--force` with `--all`, or using it for an ordinary stop |\n| Delete Aspire-owned volumes | Aspire CLI 13.6+ only. After explicit approval naming the exact AppHost and accepting that every named volume Aspire created and owns for it is deleted, which can span several databases and caches: `aspire stop --force --volumes --apphost \u003Cfilesystem-path>` | Adding `--volumes` to routine shutdown, lock recovery, or a single-resource fix without approval for that broader data scope |\n| Working in git worktree | `aspire start --non-interactive --isolated --apphost \u003Cfilesystem-path>` | `aspire_apphost_start` when it cannot request isolation |\n| Running from AI agent | Load available lifecycle tools first; resolve CLI `--apphost` fallbacks to `\u003Cfilesystem-path>`; add `--non-interactive` | Assuming interactive terminal |\n| Editing unfamiliar API | `aspire docs search \u003Ctopic>` then `aspire docs api search \u003Cquery>` for API reference | Guessing API shape |\n| C# AppHost API inspection | Use `dotnet-inspect` skill (if available) for local symbols | Guessing overloads or builder chains |\n| Adding custom dashboard\u002Fresource commands | `aspire docs search \"custom resource commands\"` first | Inventing `WithCommand` patterns without docs |\n| Installing Aspire support | Use `aspire add` or `aspire init` | ~~`dotnet workload install aspire`~~ (obsolete) |\n\nSee [safety-guardrails.md](references\u002Fsafety-guardrails.md) for detailed rules and recovery patterns.\n\n## Default Workflow\n\n1. Confirm workspace is Aspire — identify the AppHost\n2. If the workspace is a git worktree, resolve the selected AppHost to a filesystem project path and use `aspire start --non-interactive --isolated --apphost \u003Cfilesystem-path>` even when `aspire_apphost_start` is available, because the editor tool cannot request isolation. Otherwise, start with `aspire_apphost_start` in mode `run` using the exact selected `appHostPath` when available; if that tool is unavailable, resolve the selected AppHost to a filesystem project path and use `aspire start --non-interactive --apphost \u003Cfilesystem-path>`\n3. `aspire wait \u003Cresource>` before interacting with any resource\n4. `aspire describe` to inspect state, then work\n5. If AppHost code changed, restart through the same lifecycle routing; if only one resource changed, prefer the resource's commands\u002Fwatch\u002FHMR\u002Fdebug workflow\n6. Stop with `aspire_apphost_stop` using the exact selected `appHostPath` when available; use `aspire stop --non-interactive --apphost \u003Cfilesystem-path>` only for the documented fallback outcomes\n\n## Quick Reference\n\n| Task | Command |\n|------|---------|\n| Start app (agents) | Git worktree: `aspire start --non-interactive --isolated --apphost \u003Cfilesystem-path>` even if `aspire_apphost_start` is available, because the tool cannot request isolation. Otherwise: `aspire_apphost_start` (mode `run`, exact selected `appHostPath`); CLI fallback when the tool is unavailable: `aspire start --non-interactive --apphost \u003Cfilesystem-path>` |\n| Start app (human) | `aspire run` (foreground, dashboard) |\n| Stop app | `aspire_apphost_stop` (exact selected `appHostPath`); result-matrix fallback: `aspire stop --non-interactive --apphost \u003Cfilesystem-path>` |\n| Wait for resource | `aspire wait \u003Cresource>` |\n| List running AppHosts | `aspire ps` |\n| Check resource status | `aspire describe` |\n| Show hidden resources (proxies, helpers, migrations) | `aspire describe --include-hidden` |\n| Resource operation | `aspire resource \u003Cresource-name> \u003Ccommand>` such as `stop`, `start`, or `rebuild` when exposed |\n| Discover resource commands | `aspire resource \u003Cresource-name> --help` |\n| Terminal discovery, attach or tape playback | Invoke `aspire-terminals`; lifecycle\u002Freadiness remain here |\n| Create new project | `aspire new aspire-starter` |\n| Add Aspire to existing | `aspire init` (then hand off to `aspireify` skill for wiring) |\n| Add integration | `aspire add \u003Cpackage>` |\n| Discover integrations | `aspire integration list --format Json` \u002F `aspire integration search \u003Cquery> --format Json` |\n| Upgrade the CLI itself | `aspire update --self` (managed installs may print the npm\u002F.NET\u002FNix update command) |\n| Update project package refs | `aspire update --yes --non-interactive` after approval |\n| Migrate legacy TypeScript entry point | Explain that package references, config, tsconfig, imports, and the entry point all change; after approval for the package update and migration, run `aspire update --migrate --yes --non-interactive` |\n| Restore generated files | `aspire restore` |\n| Environment maintenance | `aspire cache clear`, `aspire certs trust`, `aspire certs clean` |\n| Diagnose environment | `aspire doctor` |\n| Machine-readable output | `--format Json` (supported: `ps`, `describe`, `start`) |\n| Look up API reference | `aspire docs api search \u003Cquery> --language csharp\\|typescript` |\n| Browse API entries | `aspire docs api list \u003Cscope>` |\n| Get API detail | `aspire docs api get \u003Cid>` |\n\n## Error Handling\n\n| Symptom | Cause | Action |\n|---------|-------|--------|\n| **File lock errors during build (`MSB3491`, `CS2012`)** | **Aspire is running and holds locks on `bin\u002F`, `obj\u002F`, and assemblies.** | **Stop the AppHost through the lifecycle routing above**, then rebuild or restart it. Do NOT conclude the project has a permanent build failure. |\n| \"Port already in use\" | Previous instance running | Stop, then restart through the lifecycle routing above |\n| Resource not found | App not started or name wrong | Use `aspire ps` to find the AppHost, then `aspire describe` to check resources |\n| Build errors in resource | Code error, not Aspire issue | Fix code, then use resource commands\u002Fwatch\u002FHMR\u002Fdebug workflow or restart through the lifecycle routing if AppHost code changed |\n| Environment issues | Missing SDK or tools | `aspire doctor` to diagnose |\n| JSON parse failure from `aspire start` | Mixed human\u002FJSON output ([#15843](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fissues\u002F15843)) | Strip non-JSON lines before parsing |\n| `aspire ps` hangs | AppHost on breakpoint ([#15576](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fissues\u002F15576)) | Use timeout, check AppHost process |\n| `aspire agent init` fails | Non-interactive terminal ([#16264](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fissues\u002F16264)) | Run from standard terminal |\n| Docker daemon unavailable | Container-backed resources fail to start | Start Docker Desktop, then restart through the lifecycle routing above |\n| Multiple AppHosts detected | Wrong AppHost targeted | Use `--apphost \u003Cfilesystem-path>` to specify explicitly |\n\n### ? File-Lock Recovery (MSB3491 \u002F CS2012) — Always Stop the AppHost First\n\nWhen a build fails with `error MSB3491: Could not write to output file ...` or\n`error CS2012: Cannot open ... for writing`, the project itself is healthy —\n**Aspire is running and holding file locks** on the resource's output assemblies.\nThe recovery is always the same:\n\nResolve the exact AppHost and call `aspire_apphost_stop` first when available. If a CLI\nfallback is permitted, resolve the selected AppHost to its filesystem path before using\nthe commands below; `ambiguousSession` and all other no-fallback results end the recovery\nattempt.\n\n```bash\n# ✅ CLI stop only after the result matrix permits fallback\naspire stop --non-interactive --apphost \u003Cfilesystem-path>  # release the locks\n# ... then either rebuild \u002F restart one resource if the resource exposes commands ...\naspire resource \u003Cname> rebuild   # example: C# project resource with rebuild command\n# ... or restart the whole AppHost through aspire_apphost_start. If unavailable:\naspire start --non-interactive --apphost \u003Cfilesystem-path>\n# In a git worktree:\naspire start --non-interactive --isolated --apphost \u003Cfilesystem-path>\n```\n\n| ❌ NEVER do | ✅ ALWAYS do |\n|------------|-------------|\n| Tell the user the project has a permanent build failure | Recognize the lock as Aspire holding outputs and stop the AppHost through lifecycle routing |\n| `dotnet build` again with locks held | Stop the AppHost first, then `dotnet build` (or prefer resource commands\u002Fwatch\u002FHMR\u002Fdebug workflow) |\n| Delete `bin\u002F` \u002F `obj\u002F` to \"fix\" the lock | Stop the AppHost; deletion may succeed but the next build relocks |\n| `pkill dotnet` or `kill \u003CPID>` to free locks | Use the editor stop tool or exact-target CLI fallback for clean shutdown |\n| Tell the user to \"reboot\" or \"restart your machine\" | Stop the AppHost through lifecycle routing |\n| Add `--force` or `--volumes` to release locks | Use an ordinary exact-target stop; lock recovery never needs persistent-resource or volume cleanup |\n\nThe same rule applies to any \"file in use\", \"cannot access the file\", or\n\"another process is using\" error during a build of an Aspire-managed resource.\n\n## Handoff Rules\n\n| Scenario | Route To |\n|----------|----------|\n| AppHost wiring after `aspire init` (scan repo, add resources, ServiceDefaults\u002FOTel) | → `aspireify` skill ([`aspireify\u002FSKILL.md`](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fskills\u002Faspireify\u002FSKILL.md)) or project-local `.agents\u002Fskills\u002Faspireify\u002FSKILL.md` |\n| Browser logs (`Aspire.Hosting.Browsers` \u002F `WithBrowserLogs()`) and dashboard authoring | → `aspireify` skill (code edits) and `aspire-monitoring` (discovery) |\n| Custom resource commands, arguments, or nonterminal interactions (`WithCommand`, `CommandOptions.Arguments`, `IInteractionService`) | → `aspireify` skill |\n| Terminal commands, prompts, dock\u002Fheadless sessions, REPLs, `WithTerminal`, attach or tapes | → `aspire-terminals` skill |\n| Lifecycle hooks (`SubscribeBeforeStart`, `SubscribeAfterResourcesCreated`, BeforeStart pipeline phase) | → `aspireify` skill |\n| Endpoint authoring (`WithEndpoint` updates, `ExcludeReferenceEndpoint` flag) | → `aspireify` skill |\n| Deploy, publish, pipeline steps, `aspire destroy` | → `aspire-deployment` skill |\n| Logs, traces, metrics, dashboard, `aspire dashboard run` | → `aspire-monitoring` skill |\n| Deployed app diagnostics | → `azure-diagnostics` skill (azure-skills) |\n\n## Runtime Settings And Environment\n\n| Variable | Default | Purpose |\n|----------|---------|---------|\n| `ASPIRE_ENABLE_CONTAINER_TUNNEL` | `true` | Container tunnel provides uniform host connectivity across Docker Desktop, Docker Engine, and Podman. Set to `false` to opt out. |\n| `ASPIRE_ENVIRONMENT` | unset | Selects the environment-specific config profile — controls which `appsettings.{environment}.json` is loaded and which environment is reported in dashboard telemetry. |\n| `ASPIRE_DCP_USE_DEVELOPER_CERTIFICATE` | `true` | The Aspire trusted developer certificate is used by DCP on Windows. Set to `false` to opt out. |\n| `features.defaultWatchEnabled` | false unless configured | Enables Aspire default watch for supported C# and TypeScript AppHosts. Do not treat this as per-resource rebuild, restart, or hot reload for resource source changes. |\n\n## TypeScript AppHost Note\n\nDetection covers current `apphost.mts` and legacy `apphost.ts`, but **all TS AppHost\nauthoring is delegated to `aspireify`**. The CLI-driven legacy migration is project\nmaintenance owned by this orchestration skill, not authoring. Explain that it also updates\nAspire packages, config, tsconfig, and imports; offer\n`aspire update --migrate --yes --non-interactive` only after approval for the full change,\nthen hand back to aspireify only if source authoring remains.\nCurrent rules to apply when handing off:\n\n| Rule | Why |\n|------|-----|\n| Prefer unified `withEnvironment(name, value)` over deprecated per-kind helpers (`withEnvironmentEndpoint`, `withEnvironmentParameter`, `withEnvironmentConnectionString`, `withEnvironmentExpression`, `withEnvironmentFromOutput`, `withEnvironmentFromKeyVaultSecret`) | Per-kind helpers are deprecated — single API now handles all value types |\n| Never edit `.aspire\u002Fmodules\u002F` directly | Generated; use `aspire add \u003Cpackage>` to regenerate and `aspire restore` to recover missing files |\n| Use `aspire docs api search \u003Cquery> --language typescript` for API lookup | TS surface differs from C# |\n\n## Skill Routing — In-Plugin Sibling Skills\n\nAfter `aspire init` drops a skeleton AppHost + `aspire.config.json`, route AppHost wiring\n(scan repo → propose resource graph → edit AppHost → wire `Aspire.ServiceDefaults` \u002F OTel →\nvalidate via `aspire start`) to the in-plugin **aspireify** skill: [`aspireify\u002FSKILL.md`](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fskills\u002Faspireify\u002FSKILL.md).\nFor first-run flows that only need the skeleton drop, see the in-plugin **aspire-init** skill:\n[`aspire-init\u002FSKILL.md`](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fskills\u002Faspire-init\u002FSKILL.md). This orchestration skill stays focused\non lifecycle (start\u002Fstop\u002Fwait\u002Frestart) and never edits AppHost code itself.\n\n## Project-Local Skill Precedence\n\nIf `.agents\u002Fskills\u002Faspire\u002FSKILL.md` exists (from `aspire agent init`), defer to it for:\nC# AppHost editing, TS AppHost editing, Playwright handoff, investigation workflows.\nSafety guardrails from this plugin ALWAYS apply.\n\nIf `.agents\u002Fskills\u002Faspireify\u002FSKILL.md` exists project-locally (installed by `aspire init` in\ncurrent Aspire), **warn the user** that a project-local aspireify skill is present and **defer to it**\nfor AppHost wiring instead of the in-plugin sibling. Same precedence rule as the project-local\n`aspire` skill above: project-local wins, plugin guardrails still apply.\n\n## References\n\n- [safety-guardrails.md](references\u002Fsafety-guardrails.md) — Detailed rules and recovery patterns\n- [detection.md](references\u002Fdetection.md) — Project fingerprinting\n- [app-commands.md](references\u002Fapp-commands.md) — App lifecycle and bootstrap commands\n- [resource-management.md](references\u002Fresource-management.md) — Resource wait, restart, and operations\n- [agent-workflows.md](references\u002Fagent-workflows.md) — Common agent investigation, integration, TypeScript, and handoff workflows\n","# Aspire Orchestration\n\n> **MANDATORY COMPLIANCE** — This skill prevents agent self-harm in Aspire projects.\n> Violating these rules causes file locks, orphaned processes, and user frustration ([#15801](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fissues\u002F15801)).\n\n## Prerequisites\n\n| Requirement | Install |\n|-------------|---------|\n| .NET 10.0 SDK | https:\u002F\u002Fdotnet.microsoft.com\u002Fdownload |\n| Aspire CLI (curl\u002FPowerShell) | `curl -sSL https:\u002F\u002Faspire.dev\u002Finstall.sh \\| bash` |\n| Aspire CLI (npm) | `npm install -g @microsoft\u002Faspire-cli` |\n| Aspire CLI (NativeAOT global tool, .NET 10) | `dotnet tool install -g Aspire.Cli` |\n\nUse the installation method owned by the user's environment. npm, Nix, Homebrew, WinGet,\nmise, and the install scripts are supported alongside the NativeAOT .NET global tool.\n\n## Detection\n\nActivate when ANY signal is present:\n\n| Signal | How to Detect | Confidence |\n|--------|---------------|------------|\n| C# AppHost | `.csproj` containing `Aspire.AppHost.Sdk` | ✅ Definitive |\n| File-based C# AppHost | `apphost.cs` or `.cs` file with `#:sdk Aspire.AppHost.Sdk` | ✅ Definitive |\n| TypeScript AppHost | Current `apphost.mts` or legacy `apphost.ts` file in project | ✅ Definitive |\n| Aspire config | `aspire.config.json` in project root | High |\n| Aspire settings | `.aspire\u002F` directory present | High |\n| Generated TS modules | `.aspire\u002Fmodules\u002F` directory present | High |\n| Service defaults | `\u003CIsAspireSharedProject>true` or a `*.ServiceDefaults.csproj` project reference | Medium |\n\nSee [detection.md](references\u002Fdetection.md) for detailed fingerprinting.\n\n## VS Code AppHost Lifecycle\n\nWhen the agent host exposes `aspire_apphost_start` or `aspire_apphost_stop`, use the\nmatching tool before running `aspire start` or `aspire stop` in a terminal, except when\nstarting from a git worktree requires `--isolated` and the tool cannot request it. If the\ntool is listed as deferred, load its contract with the host's tool-discovery mechanism\nfirst; do not treat an unloaded deferred tool as unavailable.\n\nPass the exact selected `appHostPath` discovered by Aspire to editor lifecycle tools. In a\nmulti-root workspace, that tool contract may require a selector such as\n`repo-a~1\u002FMyApp.AppHost\u002FMyApp.AppHost.csproj`.\n\nThe CLI `--apphost` flag does not understand that selector namespace. Before any CLI\nstart\u002Fstop fallback, resolve the selected AppHost to its actual filesystem project path\nand pass that path to `--apphost`; never copy a multi-root selector verbatim. That CLI\nproject path may be workspace-relative (`MyApp.AppHost\u002FMyApp.AppHost.csproj`) or\nabsolute (`\u002Fworkspaces\u002Frepo-a\u002FMyApp.AppHost\u002FMyApp.AppHost.csproj` or\n`C:\\workspaces\\repo-a\\MyApp.AppHost\\MyApp.AppHost.csproj`); use the current platform's\nnative path syntax. If several AppHosts are discovered and the user's target is unclear,\nask which one to use instead of guessing, invoking the tool for every AppHost, or\nissuing an unscoped CLI command.\n\nIf the selected `appHostPath` is already a normal workspace-relative project path such\nas `MyApp.AppHost\u002FMyApp.AppHost.csproj`, reuse it unchanged for CLI fallbacks; do not\nconvert it to an absolute path just for the CLI.\n\n**An unclear target is a hard stop.** Ask one clarifying question and wait for the user to\nname an AppHost. Do not call a lifecycle tool or terminal command until the target is\nresolved, and do not offer commands that bypass this gate. Stop multiple AppHosts only\nwhen the user explicitly requests all of them.\n\nFor starts, call `aspire_apphost_start` with mode `run` and the exact selected\n`appHostPath` unless the user explicitly asks to attach a debugger. In a git worktree, the\neditor tool does not currently request Aspire's isolated state. Resolve the selected\nAppHost to its filesystem path and use\n`aspire start --non-interactive --isolated --apphost \u003Cfilesystem-path>` instead.\n\n`run` mode has no debugger attached, but it still has an editor-owned Aspire session that\n`aspire_apphost_stop` can stop. After a stop call, follow this result matrix exactly:\n\n| Tool result | Next action | CLI stop allowed? |\n|-------------|-------------|-------------------|\n| `stopped` or `notRunning` | Report the result; take no further stop action | No |\n| `alreadyStopping`, controller `editor` | Report that the editor stop is already in progress; take no further stop action | No |\n| `alreadyStarting`, controller `editor` | Retry `aspire_apphost_stop` once; if it repeats, report that startup is still in progress and take no further stop action | No |\n| `notEditorOwned`, controller `external` | If the user requested that exact AppHost be stopped, resolve it to its filesystem path and run `aspire stop --non-interactive --apphost \u003Cfilesystem-path>` | Yes |\n| `failed`, controller `unknown` | Retry `aspire_apphost_stop` once; if the same result repeats, use the same exact-target CLI command above | Only after the retry |\n| `ambiguousSession` | Stop nothing and have the user disambiguate in the editor | **Never** |\n| Any other refusal or failure | Resolve or report that result; do not change mechanisms | No |\n\nThe rows are mutually exclusive. Act only on the current result; do not offer a command\nfrom another row as a speculative future workaround. Re-evaluate only after a new tool\nresult is returned.\n\n**`ambiguousSession` is a terminal safety refusal.** Do not run or offer a CLI fallback,\nand do not ask whether the user wants one. User confirmation cannot make an ambiguous\neditor session safe to terminate from the CLI.\n\nUse direct Aspire CLI lifecycle commands only when the matching editor tool is unavailable,\nfor isolated worktree starts, or for a stop result explicitly marked as allowed above.\nWhen a CLI fallback is allowed, keep the target exact by resolving the selected AppHost to\nits filesystem path first.\n\n## Safety Guardrails\n\n| Situation | ✅ ALWAYS Do | ❌ NEVER Do |\n|-----------|-------------|------------|\n| Start an Aspire app | `aspire_apphost_start` with mode `run` and the exact selected `appHostPath` when available; in a git worktree, use `aspire start --non-interactive --isolated --apphost \u003Cfilesystem-path>` even when `aspire_apphost_start` is available | `dotnet run` on AppHost |\n| Wait for resource ready | `aspire wait \u003Cresource>` | `curl` \u002F HTTP polling loops |\n| Code changed in a resource | Prefer resource commands, runtime watch\u002FHMR, dashboard actions, or IDE-managed debugging | `dotnet build` against locked files |\n| Task complete | `aspire_apphost_stop` with the exact selected `appHostPath` when available; follow its result matrix | Use an unapproved CLI fallback |\n| Check running AppHosts | `aspire ps` | Manual process inspection |\n| Check resource status | `aspire describe` | `aspire ps --resources` (removed in 13.5) |\n| Remove persistent resources | Confirm the exact AppHost and that its persistent resource instances will be removed before `aspire stop --force --apphost \u003Cfilesystem-path>`; explain that `--force` alone preserves persistent volumes | Combining `--force` with `--all`, or using it for an ordinary stop |\n| Delete Aspire-owned volumes | Aspire CLI 13.6+ only. After explicit approval naming the exact AppHost and accepting that every named volume Aspire created and owns for it is deleted, which can span several databases and caches: `aspire stop --force --volumes --apphost \u003Cfilesystem-path>` | Adding `--volumes` to routine shutdown, lock recovery, or a single-resource fix without approval for that broader data scope |\n| Working in git worktree | `aspire start --non-interactive --isolated --apphost \u003Cfilesystem-path>` | `aspire_apphost_start` when it cannot request isolation |\n| Running from AI agent | Load available lifecycle tools first; resolve CLI `--apphost` fallbacks to `\u003Cfilesystem-path>`; add `--non-interactive` | Assuming interactive terminal |\n| Editing unfamiliar API | `aspire docs search \u003Ctopic>` then `aspire docs api search \u003Cquery>` for API reference | Guessing API shape |\n| C# AppHost API inspection | Use `dotnet-inspect` skill (if available) for local symbols | Guessing overloads or builder chains |\n| Adding custom dashboard\u002Fresource commands | `aspire docs search \"custom resource commands\"` first | Inventing `WithCommand` patterns without docs |\n| Installing Aspire support | Use `aspire add` or `aspire init` | ~~`dotnet workload install aspire`~~ (obsolete) |\n\nSee [safety-guardrails.md](references\u002Fsafety-guardrails.md) for detailed rules and recovery patterns.\n\n## Default Workflow\n\n1. Confirm workspace is Aspire — identify the AppHost\n2. If the workspace is a git worktree, resolve the selected AppHost to a filesystem project path and use `aspire start --non-interactive --isolated --apphost \u003Cfilesystem-path>` even when `aspire_apphost_start` is available, because the editor tool cannot request isolation. Otherwise, start with `aspire_apphost_start` in mode `run` using the exact selected `appHostPath` when available; if that tool is unavailable, resolve the selected AppHost to a filesystem project path and use `aspire start --non-interactive --apphost \u003Cfilesystem-path>`\n3. `aspire wait \u003Cresource>` before interacting with any resource\n4. `aspire describe` to inspect state, then work\n5. If AppHost code changed, restart through the same lifecycle routing; if only one resource changed, prefer the resource's commands\u002Fwatch\u002FHMR\u002Fdebug workflow\n6. Stop with `aspire_apphost_stop` using the exact selected `appHostPath` when available; use `aspire stop --non-interactive --apphost \u003Cfilesystem-path>` only for the documented fallback outcomes\n\n## Quick Reference\n\n| Task | Command |\n|------|---------|\n| Start app (agents) | Git worktree: `aspire start --non-interactive --isolated --apphost \u003Cfilesystem-path>` even if `aspire_apphost_start` is available, because the tool cannot request isolation. Otherwise: `aspire_apphost_start` (mode `run`, exact selected `appHostPath`); CLI fallback when the tool is unavailable: `aspire start --non-interactive --apphost \u003Cfilesystem-path>` |\n| Start app (human) | `aspire run` (foreground, dashboard) |\n| Stop app | `aspire_apphost_stop` (exact selected `appHostPath`); result-matrix fallback: `aspire stop --non-interactive --apphost \u003Cfilesystem-path>` |\n| Wait for resource | `aspire wait \u003Cresource>` |\n| List running AppHosts | `aspire ps` |\n| Check resource status | `aspire describe` |\n| Show hidden resources (proxies, helpers, migrations) | `aspire describe --include-hidden` |\n| Resource operation | `aspire resource \u003Cresource-name> \u003Ccommand>` such as `stop`, `start`, or `rebuild` when exposed |\n| Discover resource commands | `aspire resource \u003Cresource-name> --help` |\n| Terminal discovery, attach or tape playback | Invoke `aspire-terminals`; lifecycle\u002Freadiness remain here |\n| Create new project | `aspire new aspire-starter` |\n| Add Aspire to existing | `aspire init` (then hand off to `aspireify` skill for wiring) |\n| Add integration | `aspire add \u003Cpackage>` |\n| Discover integrations | `aspire integration list --format Json` \u002F `aspire integration search \u003Cquery> --format Json` |\n| Upgrade the CLI itself | `aspire update --self` (managed installs may print the npm\u002F.NET\u002FNix update command) |\n| Update project package refs | `aspire update --yes --non-interactive` after approval |\n| Migrate legacy TypeScript entry point | Explain that package references, config, tsconfig, imports, and the entry point all change; after approval for the package update and migration, run `aspire update --migrate --yes --non-interactive` |\n| Restore generated files | `aspire restore` |\n| Environment maintenance | `aspire cache clear`, `aspire certs trust`, `aspire certs clean` |\n| Diagnose environment | `aspire doctor` |\n| Machine-readable output | `--format Json` (supported: `ps`, `describe`, `start`) |\n| Look up API reference | `aspire docs api search \u003Cquery> --language csharp\\|typescript` |\n| Browse API entries | `aspire docs api list \u003Cscope>` |\n| Get API detail | `aspire docs api get \u003Cid>` |\n\n## Error Handling\n\n| Symptom | Cause | Action |\n|---------|-------|--------|\n| **File lock errors during build (`MSB3491`, `CS2012`)** | **Aspire is running and holds locks on `bin\u002F`, `obj\u002F`, and assemblies.** | **Stop the AppHost through the lifecycle routing above**, then rebuild or restart it. Do NOT conclude the project has a permanent build failure. |\n| \"Port already in use\" | Previous instance running | Stop, then restart through the lifecycle routing above |\n| Resource not found | App not started or name wrong | Use `aspire ps` to find the AppHost, then `aspire describe` to check resources |\n| Build errors in resource | Code error, not Aspire issue | Fix code, then use resource commands\u002Fwatch\u002FHMR\u002Fdebug workflow or restart through the lifecycle routing if AppHost code changed |\n| Environment issues | Missing SDK or tools | `aspire doctor` to diagnose |\n| JSON parse failure from `aspire start` | Mixed human\u002FJSON output ([#15843](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fissues\u002F15843)) | Strip non-JSON lines before parsing |\n| `aspire ps` hangs | AppHost on breakpoint ([#15576](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fissues\u002F15576)) | Use timeout, check AppHost process |\n| `aspire agent init` fails | Non-interactive terminal ([#16264](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire\u002Fissues\u002F16264)) | Run from standard terminal |\n| Docker daemon unavailable | Container-backed resources fail to start | Start Docker Desktop, then restart through the lifecycle routing above |\n| Multiple AppHosts detected | Wrong AppHost targeted | Use `--apphost \u003Cfilesystem-path>` to specify explicitly |\n\n### ? File-Lock Recovery (MSB3491 \u002F CS2012) — Always Stop the AppHost First\n\nWhen a build fails with `error MSB3491: Could not write to output file ...` or\n`error CS2012: Cannot open ... for writing`, the project itself is healthy —\n**Aspire is running and holding file locks** on the resource's output assemblies.\nThe recovery is always the same:\n\nResolve the exact AppHost and call `aspire_apphost_stop` first when available. If a CLI\nfallback is permitted, resolve the selected AppHost to its filesystem path before using\nthe commands below; `ambiguousSession` and all other no-fallback results end the recovery\nattempt.\n\n```bash\n# ✅ CLI stop only after the result matrix permits fallback\naspire stop --non-interactive --apphost \u003Cfilesystem-path>  # release the locks\n# ... then either rebuild \u002F restart one resource if the resource exposes commands ...\naspire resource \u003Cname> rebuild   # example: C# project resource with rebuild command\n# ... or restart the whole AppHost through aspire_apphost_start. If unavailable:\naspire start --non-interactive --apphost \u003Cfilesystem-path>\n# In a git worktree:\naspire start --non-interactive --isolated --apphost \u003Cfilesystem-path>\n```\n\n| ❌ NEVER do | ✅ ALWAYS do |\n|------------|-------------|\n| Tell the user the project has a permanent build failure | Recognize the lock as Aspire holding outputs and stop the AppHost through lifecycle routing |\n| `dotnet build` again with locks held | Stop the AppHost first, then `dotnet build` (or prefer resource commands\u002Fwatch\u002FHMR\u002Fdebug workflow) |\n| Delete `bin\u002F` \u002F `obj\u002F` to \"fix\" the lock | Stop the AppHost; deletion may succeed but the next build relocks |\n| `pkill dotnet` or `kill \u003CPID>` to free locks | Use the editor stop tool or exact-target CLI fallback for clean shutdown |\n| Tell the user to \"reboot\" or \"restart your machine\" | Stop the AppHost through lifecycle routing |\n| Add `--force` or `--volumes` to release locks | Use an ordinary exact-target stop; lock recovery never needs persistent-resource or volume cleanup |\n\nThe same rule applies to any \"file in use\", \"cannot access the file\", or\n\"another process is using\" error during a build of an Aspire-managed resource.\n\n## Handoff Rules\n\n| Scenario | Route To |\n|----------|----------|\n| AppHost wiring after `aspire init` (scan repo, add resources, ServiceDefaults\u002FOTel) | → `aspireify` skill ([`aspireify\u002FSKILL.md`](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fskills\u002Faspireify\u002FSKILL.md)) or project-local `.agents\u002Fskills\u002Faspireify\u002FSKILL.md` |\n| Browser logs (`Aspire.Hosting.Browsers` \u002F `WithBrowserLogs()`) and dashboard authoring | → `aspireify` skill (code edits) and `aspire-monitoring` (discovery) |\n| Custom resource commands, arguments, or nonterminal interactions (`WithCommand`, `CommandOptions.Arguments`, `IInteractionService`) | → `aspireify` skill |\n| Terminal commands, prompts, dock\u002Fheadless sessions, REPLs, `WithTerminal`, attach or tapes | → `aspire-terminals` skill |\n| Lifecycle hooks (`SubscribeBeforeStart`, `SubscribeAfterResourcesCreated`, BeforeStart pipeline phase) | → `aspireify` skill |\n| Endpoint authoring (`WithEndpoint` updates, `ExcludeReferenceEndpoint` flag) | → `aspireify` skill |\n| Deploy, publish, pipeline steps, `aspire destroy` | → `aspire-deployment` skill |\n| Logs, traces, metrics, dashboard, `aspire dashboard run` | → `aspire-monitoring` skill |\n| Deployed app diagnostics | → `azure-diagnostics` skill (azure-skills) |\n\n## Runtime Settings And Environment\n\n| Variable | Default | Purpose |\n|----------|---------|---------|\n| `ASPIRE_ENABLE_CONTAINER_TUNNEL` | `true` | Container tunnel provides uniform host connectivity across Docker Desktop, Docker Engine, and Podman. Set to `false` to opt out. |\n| `ASPIRE_ENVIRONMENT` | unset | Selects the environment-specific config profile — controls which `appsettings.{environment}.json` is loaded and which environment is reported in dashboard telemetry. |\n| `ASPIRE_DCP_USE_DEVELOPER_CERTIFICATE` | `true` | The Aspire trusted developer certificate is used by DCP on Windows. Set to `false` to opt out. |\n| `features.defaultWatchEnabled` | false unless configured | Enables Aspire default watch for supported C# and TypeScript AppHosts. Do not treat this as per-resource rebuild, restart, or hot reload for resource source changes. |\n\n## TypeScript AppHost Note\n\nDetection covers current `apphost.mts` and legacy `apphost.ts`, but **all TS AppHost\nauthoring is delegated to `aspireify`**. The CLI-driven legacy migration is project\nmaintenance owned by this orchestration skill, not authoring. Explain that it also updates\nAspire packages, config, tsconfig, and imports; offer\n`aspire update --migrate --yes --non-interactive` only after approval for the full change,\nthen hand back to aspireify only if source authoring remains.\nCurrent rules to apply when handing off:\n\n| Rule | Why |\n|------|-----|\n| Prefer unified `withEnvironment(name, value)` over deprecated per-kind helpers (`withEnvironmentEndpoint`, `withEnvironmentParameter`, `withEnvironmentConnectionString`, `withEnvironmentExpression`, `withEnvironmentFromOutput`, `withEnvironmentFromKeyVaultSecret`) | Per-kind helpers are deprecated — single API now handles all value types |\n| Never edit `.aspire\u002Fmodules\u002F` directly | Generated; use `aspire add \u003Cpackage>` to regenerate and `aspire restore` to recover missing files |\n| Use `aspire docs api search \u003Cquery> --language typescript` for API lookup | TS surface differs from C# |\n\n## Skill Routing — In-Plugin Sibling Skills\n\nAfter `aspire init` drops a skeleton AppHost + `aspire.config.json`, route AppHost wiring\n(scan repo → propose resource graph → edit AppHost → wire `Aspire.ServiceDefaults` \u002F OTel →\nvalidate via `aspire start`) to the in-plugin **aspireify** skill: [`aspireify\u002FSKILL.md`](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fskills\u002Faspireify\u002FSKILL.md).\nFor first-run flows that only need the skeleton drop, see the in-plugin **aspire-init** skill:\n[`aspire-init\u002FSKILL.md`](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fskills\u002Faspire-init\u002FSKILL.md). This orchestration skill stays focused\non lifecycle (start\u002Fstop\u002Fwait\u002Frestart) and never edits AppHost code itself.\n\n## Project-Local Skill Precedence\n\nIf `.agents\u002Fskills\u002Faspire\u002FSKILL.md` exists (from `aspire agent init`), defer to it for:\nC# AppHost editing, TS AppHost editing, Playwright handoff, investigation workflows.\nSafety guardrails from this plugin ALWAYS apply.\n\nIf `.agents\u002Fskills\u002Faspireify\u002FSKILL.md` exists project-locally (installed by `aspire init` in\ncurrent Aspire), **warn the user** that a project-local aspireify skill is present and **defer to it**\nfor AppHost wiring instead of the in-plugin sibling. Same precedence rule as the project-local\n`aspire` skill above: project-local wins, plugin guardrails still apply.\n\n## References\n\n- [safety-guardrails.md](references\u002Fsafety-guardrails.md) — Detailed rules and recovery patterns\n- [detection.md](references\u002Fdetection.md) — Project fingerprinting\n- [app-commands.md](references\u002Fapp-commands.md) — App lifecycle and bootstrap commands\n- [resource-management.md](references\u002Fresource-management.md) — Resource wait, restart, and operations\n- [agent-workflows.md](references\u002Fagent-workflows.md) — Common agent investigation, integration, TypeScript, and handoff workflows\n",{"name":5,"license":15,"metadata":54,"description":7},{"author":12,"version":55},"0.0.5","main","1117facb04b403dd2fc15f048bc0e63fc67c502f","skills\u002Faspire-orchestration",12,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills","https:\u002F\u002Faspire.dev\u002Fget-started\u002Faspire-skills\u002F","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-11 08:52:06",{"source":8,"skillName":5,"commands":67,"prompt":77,"zipAvailable":78},[68,71,74],{"tool":69,"command":70},"npx","npx skills add microsoft\u002Faspire-skills --skill aspire-orchestration",{"tool":72,"command":73},"bunx","bunx skills add microsoft\u002Faspire-skills --skill aspire-orchestration",{"tool":75,"command":76},"pnpm","pnpm dlx skills add microsoft\u002Faspire-skills --skill aspire-orchestration","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fskills\u002Faspire-orchestration\u002FSKILL.md",true,[80,86,92,96,100,104,108],{"path":81,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":84,"sourceHtmlUrl":85},"evals\u002Feval.yaml","REFERENCE","参考文档",67921,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fskills\u002Faspire-orchestration\u002Fevals\u002Feval.yaml",{"path":87,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":90,"sourceHtmlUrl":91},"evals\u002Ffixtures","OTHER","其他",14,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fskills\u002Faspire-orchestration\u002Fevals\u002Ffixtures",{"path":93,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Fagent-workflows.md",6316,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fskills\u002Faspire-orchestration\u002Freferences\u002Fagent-workflows.md",{"path":97,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Fapp-commands.md",7640,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fskills\u002Faspire-orchestration\u002Freferences\u002Fapp-commands.md",{"path":101,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":102,"sourceHtmlUrl":103},"references\u002Fdetection.md",5909,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fskills\u002Faspire-orchestration\u002Freferences\u002Fdetection.md",{"path":105,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":106,"sourceHtmlUrl":107},"references\u002Fresource-management.md",2116,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fskills\u002Faspire-orchestration\u002Freferences\u002Fresource-management.md",{"path":109,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":110,"sourceHtmlUrl":111},"references\u002Fsafety-guardrails.md",17355,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fskills\u002Faspire-orchestration\u002Freferences\u002Fsafety-guardrails.md",[113,134,157,176,183,202],{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":121,"publishedAt":49},"01M6HDNG43XGF64N14PV9VGGKB","aspire-terminals","**WORKFLOW SKILL** - Author and automate Aspire terminals. USE FOR: WithTerminal, withTerminal, TerminalService, TerminalLaunchOptions, docked terminals, terminal prompts, PromptTerminalAsync, TerminalPlacement, AspireTerminalKey, WithRepl, withRepl, aspire terminal ps\u002Fattach\u002Ftape play, VHS tapes for Aspire, or terminal screen\u002Finput automation. DO NOT USE FOR: generic shell commands, ordinary AppHost resource wiring (aspireify), start\u002Fstop\u002Fwait (aspire-orchestration), logs\u002Ftraces or browser telemetry (aspire-monitoring), deployment (aspire-deployment), or nonterminal Interaction Service prompts (aspireify). INVOKES: Aspire docs\u002FAPI lookup, AppHost edits, Aspire terminal CLI; aspire-orchestration for lifecycle validation. FOR SINGLE OPERATIONS: Choose the terminal owner and lifetime first, then read the matching reference.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fskills\u002Faspire-terminals\u002FSKILL.md",[119,120],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},[31,122,123,124,30,47,48,125,39,38,126,127,128,129,32,130,131,132,133,45],"aspire terminals","cli","terminal","browser","start","api","choose","read","commands","interaction","screen","input",{"skillNo":135,"name":48,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":144,"publishedAt":49},"01M6HDMDCMMBTXTWKBVGJM0615","**WORKFLOW SKILL** - Wire Aspire AppHosts or repair TypeScript AppHost toolchains. Scans the repo, proposes a resource graph, edits C#, file-based C#, or TypeScript AppHosts, wires ServiceDefaults + OTel, validates with `aspire start`, then stops. USE FOR: wire\u002Fscaffold AppHost, add Postgres\u002FRedis\u002FRabbit\u002FMongo, connect frontend to API, after `aspire init`, AddNextJsApp, AddViteApp, WithBrowserLogs, Interaction Service, command arguments, apphost.cs, apphost.mts, unified withEnvironment, .aspire\u002Fmodules refusal, config\u002Fsecrets, TS dependency restore, pnpm\u002Fyarn\u002Fbun, or Yarn Classic. DO NOT USE FOR: skeleton drop (aspire-init), lifecycle-only start\u002Fstop\u002Fwait\u002Frestart or `aspire update --migrate` (aspire-orchestration), publish\u002Fdeploy\u002Fdestroy (aspire-deployment), logs\u002Ftraces (aspire-monitoring), terminal authoring or automation (aspire-terminals). INVOKES: aspire CLI, AppHost source edits, ServiceDefaults wiring. FOR SINGLE OPERATIONS: Run `aspire add PACKAGE` directly for a one-off integration.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fopencode\u002Fv1\u002Faspireify\u002FSKILL.md",[139,142,143],{"categoryNo":140,"categoryName":141,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},[48,145,124,146,147,148,149,150,151,39,38,126,42,152,153,154,75,155,131,156],"frontend","typescript","config","connect","run","update","yarn","command","modules","stop","authoring","wait",{"skillNo":158,"name":31,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":166,"publishedAt":49},"01M6HDM7MR6SFZHAM32RNM2MKB","**WORKFLOW SKILL** - Aspire router. Detects AppHosts, enforces guardrails, and selects the right sub-skill. USE FOR: Aspire AppHost, Aspire CLI, distributed app, cloud-native .NET, aspire start\u002Fstop\u002Fresource\u002Fdeploy\u002Fdestroy\u002Fpublish\u002Finit\u002Fnew\u002Fadd\u002Fwait\u002Fdescribe\u002Fps\u002Flogs\u002Fotel, aspire agent init, WithBrowserLogs, WithTerminal, TerminalService, terminal prompts, WithRepl, tapes, Interaction Service, apphost.mts, TS package managers, Yarn Classic, custom resource commands, .aspire\u002Fmodules recovery, ProjectResource to DotnetProjectResource migration, or Playwright URL discovery. DO NOT USE FOR: non-Aspire projects or ordinary build\u002Ftest tasks. INVOKES: aspire-init, aspireify, aspire-project-v2-migration, aspire-orchestration, aspire-deployment, aspire-monitoring, aspire-terminals. FOR SINGLE OPERATIONS: Route directly to the matching sub-skill.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fopencode\u002Fv1\u002Faspire\u002FSKILL.md",[162,165],{"categoryNo":163,"categoryName":164,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[31,30,47,167,48,168,39,38,36,169,170,171,153,172,173,46,131,45,174,175],"init","tasks","Guardrails","projects","router","route","project","URL","managers",{"skillNo":177,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":178,"categories":179,"keywords":182,"publishedAt":49},"01M6HDM2RMF6Q15YHYTS7G9SWZ","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fopencode\u002Fv1\u002Faspire-terminals\u002FSKILL.md",[180,181],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},[31,122,123,124,30,47,48,125,39,38,126,127,128,129,32,130,131,132,133,45],{"skillNo":184,"name":185,"nameZh":6,"description":186,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":187,"categories":188,"keywords":190,"publishedAt":49},"01M6HDKY1PNCDYBC317440ZHZ0","aspire-project-v2-migration","**WORKFLOW SKILL** - Safely migrates eligible Aspire 13.6+ AppHosts from legacy ProjectResource APIs to experimental DotnetProjectResource APIs after a per-resource assessment and explicit approval of exact edits. USE FOR: assess or migrate existing AddProject, addProject, AddCSharpApp, addCSharpApp, or AddBlazorGateway resources to Project v2; migrate ProjectResource to DotnetProjectResource; clean up the resulting obsolete AppHost ProjectReference edges. DO NOT USE FOR: upgrading Aspire versions, creating\u002Fwiring a new AppHost, Azure Functions migration, generic source modernization, ordinary C# resource wiring or adding a new AddProject resource (use aspireify), publishing, or build\u002Flifecycle diagnostics. INVOKES: Aspire docs\u002FAPI lookup, aspire add\u002Frestore\u002Fstart\u002Fwait, AppHost and package edits. FOR SINGLE OPERATIONS: Assess first; never edit from a generic migration request alone.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fopencode\u002Fv1\u002Faspire-project-v2-migration\u002FSKILL.md",[189],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[31,191,192,173,47,48,193,194,195,126,127,42,196,197,198,199,156,45,200,201],"aspire project v2 migration","migration","diagnostics","modernization","assessment","edit","never","up","clean","resources","source",{"skillNo":203,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":204,"categories":205,"keywords":208,"publishedAt":49},"01M6HDKQX187B70G2MK589KWC7","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Faspire-skills\u002Fblob\u002Fmain\u002Fopencode\u002Fv1\u002Faspire-orchestration\u002FSKILL.md",[206,207],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},[30,31,29,47,48,41,39,38,36,42,40,44,34,32,35,46,45,33,43,37]]