Staticphp Documentation Sync
crazywhalecc/static-php-cli
Synchronize bilingual documentation when StaticPHP v3 user-facing or developer-facing documentation must change.
Emulates any Aspire CLI build identity (channel, version, commit, package source) from a locally built CLI using ASPIRECLI environment variables and the install sidecar, so a reported bug can be…
$ npx skills add microsoft/aspire --skill cli-channel-debugging -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install microsoft/aspire cli-channel-debugging --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/microsoft/aspire.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/cli-channel-debugging .claude/skills/cli-channel-debugging && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "cli-channel-debugging" agent skill from https://github.com/microsoft/aspire/tree/main/.agents/skills/cli-channel-debugging into .claude/skills/cli-channel-debugging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-channel-debugging", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/microsoft/aspire/tree/main/.agents/skills/cli-channel-debuggingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add microsoft/aspire --skill cli-channel-debugging -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install microsoft/aspire cli-channel-debugging --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/microsoft/aspire.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/cli-channel-debugging .agents/skills/cli-channel-debugging && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "cli-channel-debugging" agent skill from https://github.com/microsoft/aspire/tree/main/.agents/skills/cli-channel-debugging into .agents/skills/cli-channel-debugging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-channel-debugging", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add microsoft/aspire --skill cli-channel-debugging -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install microsoft/aspire cli-channel-debugging --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/microsoft/aspire.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/cli-channel-debugging .cursor/skills/cli-channel-debugging && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "cli-channel-debugging" agent skill from https://github.com/microsoft/aspire/tree/main/.agents/skills/cli-channel-debugging into .cursor/skills/cli-channel-debugging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-channel-debugging", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/microsoft/aspire.git --path .agents/skills/cli-channel-debugging--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add microsoft/aspire --skill cli-channel-debugging -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install microsoft/aspire cli-channel-debugging --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/microsoft/aspire.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/cli-channel-debugging .gemini/skills/cli-channel-debugging && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "cli-channel-debugging" agent skill from https://github.com/microsoft/aspire/tree/main/.agents/skills/cli-channel-debugging into .gemini/skills/cli-channel-debugging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-channel-debugging", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install microsoft/aspire cli-channel-debuggingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add microsoft/aspire --skill cli-channel-debugging -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/microsoft/aspire.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/cli-channel-debugging .github/skills/cli-channel-debugging && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "cli-channel-debugging" agent skill from https://github.com/microsoft/aspire/tree/main/.agents/skills/cli-channel-debugging into .github/skills/cli-channel-debugging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-channel-debugging", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add microsoft/aspire --skill cli-channel-debugging -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install microsoft/aspire cli-channel-debugging --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/microsoft/aspire.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/cli-channel-debugging .opencode/skills/cli-channel-debugging && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "cli-channel-debugging" agent skill from https://github.com/microsoft/aspire/tree/main/.agents/skills/cli-channel-debugging into .opencode/skills/cli-channel-debugging/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cli-channel-debugging", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
cli-channel-debuggingEmulates any Aspire CLI build identity (channel, version, commit, package source) from a locally built CLI using ASPIRECLI environment variables and the install sidecar, so a reported bug can be…
CLI Channel Debugging is an agent skill from microsoft/aspire, published by the product's own GitHub organization. Emulates any Aspire CLI build identity (channel, version, commit, package source) from a locally built CLI using ASPIRECLI environment variables and the install sidecar, so a reported bug can be reproduced and fixed locally without going through the install/PR loop. Use this when asked to reproduce channel/version/quality-specific CLI behavior, simulate a daily/staging/stable/PR build locally, or decide which override knobs to set for a given scenario.
Its SKILL.md is about 6.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files (for example `emulate-aspire-cli.sh` and `get-aspire-channel-version.sh`).
It sits in Development, covering Secrets management and Debugging. The repository describes itself as: Aspire is the tool for code-first, extensible, observable dev and deploy. The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 809a672. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships script files (PowerShell and Shell), which the agent can run.
Shell commands in SKILL.md call:
dotnetFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.nuget.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
CLI Channel Debugging loads about 6.4k tokens when it runs. Until then it costs about 120 tokens; SKILL.md has 2,639 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from microsoft/aspire at commit 809a672, republished under its MIT licence (© microsoft). 2,639 words, ~6,436 tokens.
.claude/skills/cli-channel-debugging/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.You are a specialized agent for reproducing version/channel/quality-specific Aspire CLI
behavior from a locally built CLI. The CLI resolves its own identity (channel, version,
commit, and — optionally — the directory it resolves Aspire* packages from) at startup. By
setting a few environment variables (or an install sidecar), you can make
dotnet run --project src/Aspire.Cli -- <cmd> behave as if it were any released, staging,
daily, or PR build. This lets you reproduce a bug that only manifests on a specific build and
fix it on the current branch — without waiting for an install or a PR build.
Read docs/specs/cli-identity-sidecar.md for the full design. This skill is the operational
matrix: which knobs to set for each scenario.
Before you run any emulated CLI command, you MUST write a short line in chat declaring:
ASPIRE_CLI_PACKAGES: that you built/populated the directory yourself and verified
it is clean (exactly one version of each Aspire* package). Do not hand-wave "you
populate the directory" — actually run the build/pack, show the command, and list what
landed there.Example:
Using Scenario 2 (PR build identity + locally built packages):
ASPIRE_CLI_CHANNEL=pr-18087,ASPIRE_CLI_PACKAGES=<repo>/artifacts/packages/Release/Shipping. Packed locally with./build.sh --pack -c Release; verified Shipping has one version of eachAspire*package.
If you cannot determine the right knobs, ask — don't guess.
These are read by IdentityResolver and flow into CliExecutionContext. They change the
CLI's global identity, so they affect hive discovery, package-channel selection, staging
feed derivation, --version, telemetry identity tags, and the SDK-skew warning. They are
stripped before the CLI spawns child Aspire processes, so they never leak into peer probes
or aspire doctor's child invocations — treat them as process-local test affordances.
| Env var | Effect |
|---|---|
ASPIRE_CLI_CHANNEL | Identity channel: stable, staging, daily, local, or pr-<N>. Drives hive selection and staging-feed provenance. |
ASPIRE_CLI_VERSION | Informational version (e.g. 13.5.0-preview.1.26310.9). Drives version pins, the skew warning, and --version output. |
ASPIRE_CLI_COMMIT | Source commit SHA. Drives the staging darc feed name (darc-pub-microsoft-aspire-<sha8>). |
ASPIRE_CLI_PACKAGES | A flat directory of .nupkg files (e.g. artifacts/packages/<Config>/Shipping). The CLI synthesizes a package channel named after ASPIRE_CLI_CHANNEL that maps Aspire* to this directory (everything else → nuget.org), replacing any same-named built-in/discovered/PR channel. See the cleanliness caveat below. |
ASPIRE_CLI_NUGET_SERVICE_INDEX | Replaces the canonical https://api.nuget.org/v3/index.json URL the CLI writes into newly generated NuGet.config files. Never rewrites URLs read from existing configs. |
When any of these is set, the CLI prints a yellow banner on stderr:
Aspire CLI is emulating identity '<channel>' version '<version>'.... Seeing that banner
confirms IdentityOverridden is true.
.aspire-install.json)The same values can come from the channel, version, commit, nugetServiceIndexOverride,
and packages fields of an .aspire-install.json sidecar next to the CLI binary. Resolution
order per field is env var → sidecar field → assembly-baked stamp. Use the sidecar when
you want a persistent emulated identity for an installed binary; use env vars for one-off runs.
Installer-authored channel, version, and commit fields describe the real installed identity
and do not show the emulation banner, so use aspire doctor --format Json to confirm their source.
The developer-only nugetServiceIndexOverride and packages sidecar fields still show the banner.
These predate the global env vars and are narrower: they only influence staging-feed
routing decisions inside PackagingService; they do not change the global identity, hive
lookups, or --version. Set with aspire config set -g <key> <value>.
| Config key | Effect |
|---|---|
overrideCliIdentityChannel | Identity used for staging-feed decisions only (validated against the known channel set). |
overrideCliInformationalVersion | Informational version used to derive the staging SHA-specific feed URL. |
overrideStagingFeed | Forces staging to be available and points it at an explicit feed URL. |
stagingPinToCliVersion | When true (and using the shared feed), pins resolution to the CLI version. |
Prefer the ASPIRE_CLI_* env vars for whole-identity emulation. Use the config keys only
when you specifically want to exercise staging-feed routing from an otherwise-plain local build
(the eng/scripts/debug-staging.sh / debug-stable.sh recipes do exactly this — see
docs/cli-staging-validation.md).
# From the repo root. Build once, then run with the knobs set:
ASPIRE_CLI_CHANNEL=daily \
ASPIRE_CLI_VERSION=13.5.0-preview.1.26310.9 \
ASPIRE_CLI_COMMIT=95f0d2968... \
dotnet run --project src/Aspire.Cli -- <command>You can also run the already-built binary directly to skip the rebuild:
artifacts/bin/Aspire.Cli/Debug/net11.0/aspire.dll via dotnet <dll> -- <command>.
Confirm the emulation took effect: aspire --version prints the emulated version, and the
emulation banner appears on stderr. (Note: aspire doctor reports some fields from the
physical binary by design — see the spec.)
Polyglot channel resolution from a source build. When you run a source (DEBUG) build from inside the Aspire repo,
AspireRepositoryDetectorcan match the repo'sAspire.slnx(it falls back to the CLI binary'sEnvironment.ProcessPath, not the apphost's location). For a polyglot (TypeScript/Python) apphost that would force "project-reference mode" and short-circuit channel resolution, soaspire addwould silently resolve stable nuget.org packages instead of the emulated channel's feed. To keep emulation faithful,GuestAppHostProject.IsUsingProjectReferencesnow returnsfalsewhenever anASPIRE_CLI_*identity override is active — so setting any identity env var makes the source build resolve packages exactly like the installed CLI it is emulating. (A real installed CLI is unaffected: Release builds only honorASPIRE_REPO_ROOT.)
Two scripts live next to this SKILL.md (each with a .sh and a .ps1 variant). Always
prefer them over hand-typing versions — the daily/staging feeds are unsorted and interleave
old 9.x builds, so eyeballing "the latest" is error-prone.
get-aspire-channel-version.{sh,ps1} — resolve the version to emulateMaps a channel to the exact feed the CLI's built-in package channels resolve Aspire* from
(see src/Aspire.Cli/Packaging/PackagingService.cs), queries it anonymously, and prints only
the latest version to stdout (diagnostics go to stderr), so it pipes cleanly into
ASPIRE_CLI_VERSION:
.agents/skills/cli-channel-debugging/get-aspire-channel-version.sh stable # -> 13.4.3 (nuget.org)
.agents/skills/cli-channel-debugging/get-aspire-channel-version.sh daily # -> 13.5.0-preview.1.NNNNN.N (dnceng/dotnet9)
.agents/skills/cli-channel-debugging/get-aspire-channel-version.sh staging --commit <sha> # darc-pub-microsoft-aspire-<sha8>
export ASPIRE_CLI_VERSION="$(.agents/skills/cli-channel-debugging/get-aspire-channel-version.sh daily)"Options: --package <id> (default Aspire.Hosting.AppHost, present on all three feeds and
versioned identically to the product), --stable-only (daily/staging → stable-shaped only),
--prerelease (stable → allow prereleases). Staging requires --commit; note darc feeds are
per-RC-build and may have been garbage-collected for older commits (clean 404 = no such feed).
emulate-aspire-cli.{sh,ps1} — one-line scenario setup (SOURCE it)Sets the ASPIRE_CLI_* env vars and defines an aspire function pointing at this repo's built
CLI. For stable/daily/staging it auto-resolves the version via the resolver above. It
must be sourced (bash/zsh) or dot-sourced (pwsh) so the env + function persist:
# bash / zsh — builds the CLI, resolves the latest daily version, defines `aspire`
source .agents/skills/cli-channel-debugging/emulate-aspire-cli.sh daily
aspire --version # confirms the emulation banner + version. .agents/skills/cli-channel-debugging/emulate-aspire-cli.ps1 staging -Commit <sha>
aspire --versionOptions: --version <v> / -Version (pin instead of auto-resolving; required for local/pr-<N>),
--commit / -Commit, --packages <dir> / -Packages (sets ASPIRE_CLI_PACKAGES), --config
/ -Config (Debug|Release, default Debug), --no-build / -NoBuild (use an existing binary).
When running inside the Copilot app, give the user a live, reusable shell per scenario by
opening a Terminal canvas rather than only running one-off bash tool commands. The flow:
get-aspire-channel-version.sh so the title and env are
accurate.dotnet build src/Aspire.Cli/Aspire.Cli.csproj -p:SkipNativeBuild=true),
or let emulate-aspire-cli.sh build it.open_canvas with canvasId: "terminal" and a descriptive title (e.g.
aspire (emulating daily 13.5.0-preview.1.NNNNN.N)); pick a stable instanceId per scenario
so re-opening focuses the same panel. Open a separate instance per identity so the user
can keep, say, a stable and a daily terminal side by side.send_terminal_input action (input must be an object, e.g.
{"input": "aspire --version"}; a trailing Enter is added by default). The fastest setup is a
single source .agents/skills/cli-channel-debugging/emulate-aspire-cli.sh <channel> line;
otherwise send the export ASPIRE_CLI_* lines and the aspire() { dotnet "<dll>" "$@"; }
function definition individually.aspire --version. read_terminal_output may be unavailable in some app
contexts ("Terminal not found or not running"); when it is, confirm the emulation
independently by running the same env + built aspire.dll through a normal bash tool call
and checking the banner + version match — the canvas keystrokes are still delivered for the
user.Reuse instanceIds across turns so "the daily terminal" stays the same panel the user is looking at.
| # | Scenario | Identity | Aspire* package source | How |
|---|---|---|---|---|
| 1 | Local build + locally built packages (local hive) | local | ~/.aspire/hives/local/packages or local Shipping dir | ./localhive.sh (no env vars) — or ASPIRE_CLI_PACKAGES=<Shipping> |
| 2 | PR build identity + locally built packages | pr-<N> | local Shipping dir | ASPIRE_CLI_CHANNEL=pr-<N> + ASPIRE_CLI_PACKAGES=<Shipping> |
| 3 | PR build identity + CI-built packages, local CLI | pr-<N> | ~/.aspire/hives/pr-<N>/packages | get-aspire-cli-pr.sh --pr <N>, then ASPIRE_CLI_CHANNEL=pr-<N> |
| 4 | Latest daily, local CLI | daily | dnceng/dotnet9 daily feed | ASPIRE_CLI_CHANNEL=daily + ASPIRE_CLI_VERSION (+ ASPIRE_CLI_COMMIT) |
| 5 | Staging, unstable version | staging | darc-pub-microsoft-aspire-<sha8> feed (quality Both) | ASPIRE_CLI_CHANNEL=staging + prerelease ASPIRE_CLI_VERSION + ASPIRE_CLI_COMMIT |
| 6 | Staging, stable version | staging | darc-pub-microsoft-aspire-<sha8> feed (quality Both) | ASPIRE_CLI_CHANNEL=staging + stable-shaped ASPIRE_CLI_VERSION + ASPIRE_CLI_COMMIT |
| 7 | Released build repro | stable | nuget.org | ASPIRE_CLI_CHANNEL=stable + released ASPIRE_CLI_VERSION |
| 7b | Released repro + CLI+hosting fix spanning packages | stable | locally rebuilt Shipping dir | as 7 + ASPIRE_CLI_PACKAGES=<clean-rebuilt-dir> |
./localhive.sh [-c Release|Debug] [-n <hive>] packs NuGet packages into
artifacts/packages/<Config>/Shipping, creates ~/.aspire/hives/<hive>/packages, and installs
the CLI to ~/.aspire/bin. The installed CLI bakes a local identity and discovers the hive —
no env vars needed.
To skip the hive copy and point a dev-tree CLI straight at the packed output:
./build.sh --pack -c Release # -> artifacts/packages/Release/Shipping
ASPIRE_CLI_PACKAGES="$PWD/artifacts/packages/Release/Shipping" \
dotnet run --project src/Aspire.Cli -- <cmd>You (the agent) build the packages, then run the local CLI as the PR build:
./build.sh --pack -c Release # produces artifacts/packages/Release/Shipping
# Verify the Shipping dir is clean (one version per Aspire* package) before running.
ASPIRE_CLI_CHANNEL=pr-<N> \
ASPIRE_CLI_PACKAGES="$PWD/artifacts/packages/Release/Shipping" \
dotnet run --project src/Aspire.Cli -- <cmd>ASPIRE_CLI_PACKAGES wins over a same-named hive or PR-install channel, so the CLI resolves
Aspire* from your freshly built packages while presenting a pr-<N> identity.
Use this to test something locally against a PR's CI-built packages without rebuilding them:
eng/scripts/get-aspire-cli-pr.sh --pr <N> # populates ~/.aspire/hives/pr-<N>/packages
ASPIRE_CLI_CHANNEL=pr-<N> dotnet run --project src/Aspire.Cli -- <cmd>No ASPIRE_CLI_PACKAGES — the local CLI discovers ~/.aspire/hives/pr-<N> by name because its
identity channel matches. (See docs/dogfooding-pull-requests.md and eng/scripts/README.md.)
# Fast path: resolves the real latest daily version, builds, defines `aspire`.
source .agents/skills/cli-channel-debugging/emulate-aspire-cli.sh daily
# Manual equivalent:
ASPIRE_CLI_CHANNEL=daily \
ASPIRE_CLI_VERSION="$(.agents/skills/cli-channel-debugging/get-aspire-channel-version.sh daily)" \
dotnet run --project src/Aspire.Cli -- <cmd>The daily channel maps Aspire* to the dnceng dotnet9 feed. Use the real daily version
of the build you're emulating (the resolver gives it to you) so version pins and the skew
warning match what users saw. ASPIRE_CLI_COMMIT is optional here — daily resolves from the
shared feed, not a SHA-specific darc feed.
# 5 — unstable (prerelease-shaped) version -> quality Both
ASPIRE_CLI_CHANNEL=staging \
ASPIRE_CLI_VERSION=13.4.0-preview.1.26280.6 \
ASPIRE_CLI_COMMIT=<full-commit-sha> \
dotnet run --project src/Aspire.Cli -- <cmd>
# 6 — stable-shaped version -> quality Both (the #17527 stabilizing-build scenario)
ASPIRE_CLI_CHANNEL=staging ASPIRE_CLI_VERSION=13.4.0 ASPIRE_CLI_COMMIT=<full-commit-sha> \
dotnet run --project src/Aspire.Cli -- <cmd>Staging feed provenance is derived from the commit: darc-pub-microsoft-aspire-<sha8>. The
channel uses Both for either version shape because a stable-shaped build can still publish
prerelease-only integrations alongside stable packages.
Alternatively, eng/scripts/debug-staging.sh / debug-stable.sh exercise the same routing via
the legacy config keys — see docs/cli-staging-validation.md.
# Fast path: resolves the latest stable on nuget.org (override with --version for an older release).
source .agents/skills/cli-channel-debugging/emulate-aspire-cli.sh stable
# Manual / pin a specific release:
ASPIRE_CLI_CHANNEL=stable ASPIRE_CLI_VERSION=13.4.2 dotnet run --project src/Aspire.Cli -- <cmd>The stable channel maps Aspire* to nuget.org. Use the exact released version the bug was
reported against (get-aspire-channel-version.sh stable gives the current latest).
When the fix touches packages too (e.g. Aspire.Hosting.*), rebuild those packages from the
current branch at the released version into a clean directory and layer them in:
./build.sh --pack -c Release # rebuild packages from this branch's source
# Stage exactly the packages you changed into a clean dir (or clean Shipping first).
ASPIRE_CLI_CHANNEL=stable \
ASPIRE_CLI_VERSION=13.4.2 \
ASPIRE_CLI_PACKAGES="$PWD/artifacts/packages/Release/Shipping" \
dotnet run --project src/Aspire.Cli -- <cmd>Identity stays stable/13.4.2 while Aspire* resolves from your locally rebuilt packages, so
you can validate a CLI+hosting fix together before publishing anything.
Use this to dry-run a not-yet-shipped release (e.g. emulate a future 13.5.0 stable build)
entirely from locally built packages — templates and integrations both resolve from a local
directory, nothing has to be published. This is the most self-contained scenario and the one the
identity-sidecar package-resolution fix specifically enables.
# 1. Build packages in the exact version shape you want to emulate.
# Stable shape (no prerelease suffix):
./build.sh --pack -c Release /p:VersionPrefix=13.5.0 /p:StabilizePackageVersion=true
# Prerelease shape instead: /p:VersionPrefix=13.5.0 /p:VersionSuffix=preview.1
STABLE_DIR="$PWD/artifacts/packages/Release/Shipping" # clean: one version per Aspire* id
# 2. (Buildability) Register the local dir as an AMBIENT NuGet source — see note below.
dotnet nuget add source "$STABLE_DIR" --name local-emulated-stable
# 3. Emulate the release. aspire new + aspire add now resolve 13.5.0 from the local dir.
ASPIRE_CLI_CHANNEL=stable ASPIRE_CLI_VERSION=13.5.0 ASPIRE_CLI_PACKAGES="$STABLE_DIR" \
dotnet run --project src/Aspire.Cli -- new aspire-starter --name MyApp --non-interactiveTurnkey alternative —
localhive --version../localhive.sh --version 13.5.0(or.\localhive.ps1 -Version 13.5.0) packs the stable shape, populates~/.aspire/hives/local/packageswith only the exact13.5.0packages, and installs the CLI — no manualVersionPrefix/StabilizePackageVersionflags and no stale-version cleanup needed. Add--archiveto also produce a portable.tar.gzfor the E2E tests (below). You still set the threeASPIRE_CLI_*env vars (and the ambient source for buildability) to emulate the release from that hive.Fully turnkey with
-o DIR../localhive.sh --version 13.5.0 -o /tmp/aspire-1350writes a self-contained portable layout (bin/,hives/local/packages/) and anactivate.sh(localhive.ps1writesactivate.ps1).source /tmp/aspire-1350/activate.shputs the CLI on PATH, exports the threeASPIRE_CLI_*vars (channel=stable, version=13.5.0, packages=the hive), sets a hermeticNUGET_PACKAGES(see the cache hazard below), and drops you into awork/dir — a one-command emulated stable session.
⚠️ NuGet global-cache pollution when rebuilding a FIXED stable version. NuGet's global packages folder (
~/.nuget/packages/<id>/<version>/) caches extracted packages keyed by the version string. When you emulate a fixed stable version like13.5.0and then rebuild it, a stale13.5.0left in that shared cache by an earlier build silently shadows the freshly built one — same version string, different content — because restore never re-extracts from your local hive. The staleAspire.AppHost.Sdk/13.5.0can then inject a prerelease version floor (e.g.Version=">= 13.5.0-dogfood.…"); NuGet picks the lowest version satisfying that floor and restore drifts to a stray cached prerelease (e.g.13.5.0-pr.17781) instead of your stable packages — visible asNU1603warnings and aproject.assets.jsonbound to the prerelease. Remedy: isolate the cache per emulation with a hermeticNUGET_PACKAGES(e.g.export NUGET_PACKAGES=/tmp/aspire-1350/.nuget-packages).localhive … -o DIR's generatedactivate.sh/activate.ps1does this for you. CI is unaffected (fresh containers start with an empty cache); this only bites local iterative rebuilds.
Automated coverage.
EmulatedLocalReleaseBuildTests(C# + TypeScript) exercises this exact scenario end-to-end: it consumes alocalhive --version <X.Y.Z> --archivearchive, emulates the stable identity withASPIRE_CLI_PACKAGESpointed at the hive, and assertsaspire new/aspire addresolve the future-only version locally. The tests skip unless given a stable-shaped local archive, so they add zero cost to default CI. See.agents/skills/cli-e2e-testing/SKILL.md.
Package/template resolution now honors ASPIRE_CLI_PACKAGES for any emulated channel name.
Historically the CLI only searched the local-packages channel when its name looked like a
local build (local/pr-<N>/run-<N>); emulating stable/staging/daily silently fell back
to nuget.org for aspire new/aspire add. The CLI now recognizes a channel as locally backed by
its mappings (an Aspire* mapping pointing at an existing directory), not its name, so the
override works under every emulated identity.
⚠️ Buildability needs an ambient NuGet source (step 2). A real
stablebuild deliberately drops no per-projectNuGet.config(it relies on nuget.org being an ambient source). When you emulatestablewith a local version that isn't on nuget.org, the apphost still won't build unless the local dir is reachable: MSBuild resolves theAspire.AppHost.Sdkbefore restore and reads onlyNuGet.configsources (it ignoresRestoreAdditionalProjectSourcesandASPIRE_CLI_PACKAGES). Soaspire newwill scaffold the project (templates come from the local dir), butaspire add/aspire runfail withCould not resolve SDK "Aspire.AppHost.Sdk/13.5.0"until you add the local dir as an ambient source (dotnet nuget add source, a user/parent-levelNuGet.config, etc.). This mirrors how real stable relies on an ambient nuget.org — the local dir is the emulated ambient feed.aspire additself still drops a projectNuGet.configfor thedotnet add packagerestore; the ambient source is only needed for the SDK-resolution build step. Remove the source when done:dotnet nuget remove source local-emulated-stable.
ASPIRE_CLI_PACKAGES cleanliness caveat (fail-fast)A flat directory feed has no "latest stable vs latest prerelease" semantics: if the same
Aspire* package id appears with more than one version, NuGet would silently resolve the
highest and mask the version you meant to test. The CLI therefore fails fast with:
The Aspire CLI packages override directory '
<dir>' contains more than one version of the same Aspire package... Clean the directory so eachAspire*package appears exactly once. Conflicts: Aspire.Hosting (13.4.1, 13.4.2).
This commonly bites because ./localhive.sh auto-generates a fresh local.YYYYMMDD.tHHmmss
version each run and accumulates them in artifacts/packages/<Config>/Shipping. Before
pointing ASPIRE_CLI_PACKAGES at Shipping, clean stale .nupkg files (or repack fresh) so
each Aspire* id has exactly one version. The directory must also exist (missing → fail-fast).
get-aspire-channel-version.{sh,ps1} + emulate-aspire-cli.{sh,ps1} (next to this file) —
resolve the version to emulate and one-line scenario setup; see "Helper scripts" above.docs/specs/cli-identity-sidecar.md — identity resolution design, sidecar schema, the full
list of ASPIRE_CLI_* overrides including ASPIRE_CLI_PACKAGES.docs/cli-staging-validation.md — staging/stable feed routing and the debug-staging.sh /
debug-stable.sh recipes.docs/dogfooding-pull-requests.md + eng/scripts/README.md — installing PR builds with
get-aspire-cli-pr.sh.localhive.sh (repo root) — build packages + CLI + hive locally.© microsoft, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 4 other files in .agents/skills/cli-channel-debugging of microsoft/aspire.
Open the folder on GitHubat commit 809a672
CLI Channel Debugging next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| CLI Channel Debugging this skillmicrosoft/aspire | 6.3k | — | ~6.4k | Automated safety check: Pass | MIT | |
| Staticphp Documentation Synccrazywhalecc/static-php-cli | 1.9k | — | ~2.2k | Automated safety check: Pass | MIT | |
| Daytona Sandbox Operationsdifferent-ai/openwork | 24k | — | ~917 | Automated safety check: Pass | Custom licence | |
| Debugging MarchatCod-e-Codes/marchat | 137 | — | ~668 | Automated safety check: Notes | MIT | |
| Batch Filesgithub/awesome-copilot | 40k | 1 repos | ~4.3k | Automated safety check: Pass | MIT | |
| Debugsbusso/claudeclaw | 194 | 1 repos | ~3.3k | Automated safety check: Notes | MIT |
crazywhalecc/static-php-cli
Synchronize bilingual documentation when StaticPHP v3 user-facing or developer-facing documentation must change.
different-ai/openwork
Covers Daytona CLI setup, sandbox debugging, keeping a sandbox alive and which credentials the CLI uses, for when Daytona itself is the problem rather than the tests.
Cod-e-Codes/marchat
Diagnoses marchat client and server issues using -doctor, env configuration, and logs.
github/awesome-copilot
Expert-level Windows batch file (.bat/.cmd) skill for writing, debugging, and maintaining CMD scripts.
sbusso/claudeclaw
Debug container agent issues. An agent skill from sbusso/claudeclaw.
brightdata/skills
Debug Bright Data Scraping Browser sessions using the Browser Sessions API.
microsoft/aspire
A skill your agent uses when asked to trigger or inspect Aspire internal Azure DevOps builds, source-index runs, or release validation on dnceng/internal; push to the internal mirror; download build…
microsoft/aspire
Backports a merged PR to a release branch by triggering the /backport bot, waiting for the bot-created PR, and filling in the shiproom template (Customer Impact, Testing, Risk, Regression?).
microsoft/aspire
Bumps the Aspire repository product version in eng/Versions.props using previous version-bump commits as guidance.
microsoft/aspire
Guide for diagnosing GitHub Actions test failures, extracting failed tests from runs, and creating or updating failing-test issues.
microsoft/aspire
Create a pull request using the repository PR template. An agent skill from microsoft/aspire.
microsoft/aspire
Guide for writing tests for the Aspire Dashboard. An agent skill from microsoft/aspire.
Categories
Emulates any Aspire CLI build identity (channel, version, commit, package source) from a locally built CLI using ASPIRECLI environment variables and the install sidecar, so a reported bug can be…. CLI Channel Debugging is an agent skill from microsoft/aspire, published by the product's own GitHub organization. Emulates any Aspire CLI build identity (channel, version, commit, package source) from a locally built CLI using ASPIRECLI environment variables and the install sidecar, so a reported bug can be reproduced and fixed locally without going through the install/PR loop.
CLI Channel Debugging fits situations like: tasks that involve Secrets management; tasks that involve Debugging.
Run `npx skills add microsoft/aspire --skill cli-channel-debugging -a claude-code`. Or copy the skill folder (.agents/skills/cli-channel-debugging in microsoft/aspire) into .claude/skills/cli-channel-debugging in your project. Claude Code loads it when a task matches its description.
Run `npx skills add microsoft/aspire --skill cli-channel-debugging -a codex`. Or copy the skill folder (.agents/skills/cli-channel-debugging in microsoft/aspire) into .agents/skills/cli-channel-debugging in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add microsoft/aspire --skill cli-channel-debugging -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/cli-channel-debugging, .gemini/skills/cli-channel-debugging, .github/skills/cli-channel-debugging and .opencode/skills/cli-channel-debugging in your project.
Going by SKILL.md and its folder, CLI Channel Debugging needs PowerShell and a shell for the scripts in its folder and the command-line tools its instructions call (dotnet). Our summary lists: A Bash shell; PowerShell.
SKILL.md names 1 domain. In commands or code: api.nuget.org; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
CLI Channel Debugging is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.4k tokens (SKILL.md is roughly 26k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with CLI Channel Debugging: Staticphp Documentation Sync (crazywhalecc/static-php-cli, 1.9k stars), Daytona Sandbox Operations (different-ai/openwork, 24k stars), Debugging Marchat (Cod-e-Codes/marchat, 137 stars) and Batch Files (github/awesome-copilot, 40k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
microsoft (a GitHub organization, an official publisher) maintains it in microsoft/aspire, which has 6,348 GitHub stars. The repository holds 22 skills in this directory. The repository was last updated on October 7, 2026.
Source: microsoft/aspire on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.