Appllama App Design Skill
Appllama/appllama-skills
Build native-feeling, benchmark-quality mobile app screens (Expo / React Native).
Adds MAUI-specific guardrails on top of the maestro-cli skill and Maestro MCP tools for darc, BAR, and channel or feed lookups in dotnet/maui.
$ npx skills add dotnet/maui --skill dependency-flow -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install dotnet/maui dependency-flow --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/dotnet/maui.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.github/skills/dependency-flow .claude/skills/dependency-flow && 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 "dependency-flow" agent skill from https://github.com/dotnet/maui/tree/main/.github/skills/dependency-flow into .claude/skills/dependency-flow/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dependency-flow", 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/dotnet/maui/tree/main/.github/skills/dependency-flowType 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 dotnet/maui --skill dependency-flow -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install dotnet/maui dependency-flow --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/maui.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.github/skills/dependency-flow .agents/skills/dependency-flow && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "dependency-flow" agent skill from https://github.com/dotnet/maui/tree/main/.github/skills/dependency-flow into .agents/skills/dependency-flow/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dependency-flow", 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 dotnet/maui --skill dependency-flow -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install dotnet/maui dependency-flow --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/maui.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.github/skills/dependency-flow .cursor/skills/dependency-flow && 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 "dependency-flow" agent skill from https://github.com/dotnet/maui/tree/main/.github/skills/dependency-flow into .cursor/skills/dependency-flow/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dependency-flow", 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/dotnet/maui.git --path .github/skills/dependency-flow--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 dotnet/maui --skill dependency-flow -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install dotnet/maui dependency-flow --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/maui.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.github/skills/dependency-flow .gemini/skills/dependency-flow && 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 "dependency-flow" agent skill from https://github.com/dotnet/maui/tree/main/.github/skills/dependency-flow into .gemini/skills/dependency-flow/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dependency-flow", 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 dotnet/maui dependency-flowInstalls 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 dotnet/maui --skill dependency-flow -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/dotnet/maui.git skills-src && mkdir -p .github/skills && cp -r skills-src/.github/skills/dependency-flow .github/skills/dependency-flow && 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 "dependency-flow" agent skill from https://github.com/dotnet/maui/tree/main/.github/skills/dependency-flow into .github/skills/dependency-flow/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dependency-flow", 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 dotnet/maui --skill dependency-flow -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install dotnet/maui dependency-flow --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/maui.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.github/skills/dependency-flow .opencode/skills/dependency-flow && 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 "dependency-flow" agent skill from https://github.com/dotnet/maui/tree/main/.github/skills/dependency-flow into .opencode/skills/dependency-flow/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dependency-flow", 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.
dependency-flowAdds MAUI-specific guardrails on top of the maestro-cli skill and Maestro MCP tools for darc, BAR, and channel or feed lookups in dotnet/maui.
This skill prefers Maestro MCP tools first, falls back to the mstro CLI from the maestro-cli skill when those tools aren't loaded, and reaches for the darc CLI only for operations neither one covers, such as asset or feed lookups, adding a build to a channel, updating or adding a dependency, and verifying dependencies.
It documents MAUI's channel naming, including automatic SDK channels where several servicing release branches for one band all map onto a single general SDK channel, and it warns against inventing a channel name that doesn't exist, always verifying with the real lookup command instead.
2 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 7d38fd0. 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 1 file in scripts/ (PowerShell), which the agent can run.
Shell commands in SKILL.md call:
gitazpwshghFrom 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:
dev.azure.comgithub.comFrom 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.
.NET MAUI Dependency Flow Guide loads about 10k tokens when it runs. Until then it costs about 82 tokens; SKILL.md has 4,023 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); the scripts in this folder are not scanned.
The full file from dotnet/maui at commit 7d38fd0, republished under its MIT licence (© dotnet). 4,023 words, ~10,119 tokens.
.claude/skills/dependency-flow/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.This skill provides MAUI-specific context for dependency flow operations. Use it together with the maestro-cli skill (loaded from the dotnet-dnceng@dotnet-arcade-skills plugin via .github/copilot/settings.json) or the maestro MCP tools when available.
First: use maestro MCP tools or invoke the
maestro-cliskill — they handle the core query and mutation workflow. This skill provides MAUI-specific rules and context on top of that.
The maestro-cli skill and its mstro CLI are loaded automatically from the dotnet/arcade-skills plugin (configured in .github/copilot/settings.json via enabledPlugins). No manual download is needed.
maestro_build, maestro_builds, maestro_latest_build, maestro_default_channels, maestro_subscriptions, maestro_subscription_health, etc.)mstro CLI via maestro-cli skill — fallback when MCP tools aren't loaded, or for scripting with --json and jqdarc CLI — only for operations neither MCP nor mstro cover (see below)darc CLI| Operation | Command | Why |
|---|---|---|
| Asset/feed lookup | darc get-asset --name ... --version ... | No MCP/mstro equivalent for asset search |
| Add build to channel | darc add-build-to-channel --id ... --channel ... | No MCP/mstro equivalent |
| Update dependencies | darc update-dependencies --channel ... | Mutates local Version.Details.xml |
| Add dependency | darc add-dependency --name ... | Mutates local Version.Details.xml |
| Verify dependencies | darc verify | No MCP/mstro equivalent |
MAUI uses two types of channels:
Pattern: .NET X.0.Yxx SDK (e.g., .NET 10.0.1xx SDK)
These are configured via default channel mappings — builds are automatically added when they complete on a mapped branch.
Common branch → channel patterns (not exhaustive — always verify with the command below):
release/X.0.Yxx-srN) all map to the single general SDK channel for that band (e.g., release/10.0.1xx-sr6, release/10.0.1xx-sr7, etc. all map to .NET 10.0.1xx SDK). There is no .NET X.0.Yxx SDK SRn channel — do not invent one.release/X.0.Yxx-previewN) map to dedicated per-preview channels (e.g., release/11.0.1xx-preview3 → .NET 11.0.1xx SDK Preview 3). See Subscription Authoring & Lifecycle below for how to wire a new preview channel into the maui subscription set, including the PR #35364 channel/branch mismatch trap.release/X.0.Yxx-rcN) use dedicated per-RC channels (e.g., .NET 10.0.1xx SDK RC 2) only while their cycle is active — these default mappings are removed after the RC ships, so get-default-channels will show no RC sibling to copy from. If you can't find a sibling, stop and tell the user to escalate to release engineering — do not guess the channel name.main, netN.0, release/X.0.Yxx) map to the general SDK channel for that band.-rc2.1, -preview6.1), inflight/* mirrors, and vendor-suffixed branches (e.g., release/10.0.1xx-meaipreview1). Do not assume the four bullets above are complete — always check.Always verify by listing existing mappings before constructing a command:
darc get-default-channels --source-repo https://github.com/dotnet/mauiFind a sibling branch (e.g., the previous SR or the previous preview) and copy its channel exactly. If no sibling exists (common for RC branches outside an active cycle), stop and tell the user that release engineering needs to configure the channel mapping — do not guess the channel name.
Common case: a new servicing release branch is created (e.g., release/10.0.1xx-sr7) and needs to be added so its builds flow automatically.
⚠️ add-default-channel is in the explicit-confirmation list below. Show the user the exact command and wait for approval before running:
darc add-default-channel \
--channel ".NET 10.0.1xx SDK" \
--branch release/10.0.1xx-sr7 \
--repo https://github.com/dotnet/mauiPattern: .NET X Workload Release (e.g., .NET 10 Workload Release)
These are NOT in default channel mappings. A build must be manually promoted to a workload release channel to make assets available on the public dotnet feeds. This can be done two ways:
darc add-build-to-channel --id <BAR_BUILD_ID> --channel ".NET X Workload Release"Current workload release channels (IDs shown for reference — when running add-build-to-channel, always specify the channel via --channel "<name>", not by its numeric channel ID):
.NET 11 Workload Release (channel ID: 8299).NET 10 Workload Release (channel ID: 5174).NET 9 Workload Release (channel ID: 4611).NET 8 Workload Release (channel ID: 4610)To choose the right one: match the .NET major version of the build's branch (e.g., release/10.0.1xx-sr6 → .NET 10 Workload Release).
| User says | Action |
|---|---|
| "feeds for .NET MAUI X.Y.Z" | darc get-asset --name Microsoft.Maui.Controls --version X.Y.Z |
| "where is MAUI X.Y.Z" | darc get-asset --name Microsoft.Maui.Controls --version X.Y.Z |
| "latest MAUI build" | MCP: maestro_latest_build(repository="https://github.com/dotnet/maui") |
| "what channels is MAUI on" | MCP: maestro_default_channels(repository="https://github.com/dotnet/maui") |
| "subscription health for MAUI" | MCP: maestro_subscription_health(targetRepository="https://github.com/dotnet/maui") |
| "validate a Preview workload install" | Use release-readiness's PreviewInstallability.ps1; it resolves the workload-set package, public component feeds, package-source mapping, and representative packs without mutating feeds. |
add-channel / delete-channel — Channel management is an infrastructure decisionset-repository-policies — Merge policy changes affect repo securitygather-drop — Bulk artifact download is not needed in agent contextAlways show the user the exact command and wait for explicit approval before running:
add-build-to-channel — Triggers promotion builds that publish packages to feedsadd-subscription / update-subscription / delete-subscriptions — Modifies dependency flow automationadd-default-channel / delete-default-channel — Changes channel mappingsupdate-dependencies / add-dependency — Mutates Version.Details.xmlmaestro_trigger_subscription / trigger-subscriptions — Triggers dependency flowmaestro_trigger_daily_update — Triggers ALL daily-update subscriptions ecosystem-wide-q or --quiet flags — These bypass confirmation prompts9.0.60, 10.0.0-preview.4)maestro_default_channels or be a known Workload Release channel (.NET X Workload Release) — never accept arbitrary names# 1. Look up the asset (darc CLI — no MCP equivalent)
darc get-asset --name Microsoft.Maui.Controls --version X.Y.Z
# 2. Check output for NugetFeed in Locations
# - If present: done, report the feed URL
# - If missing: build hasn't been added to a channel yet
# 2b. Get the BAR build ID (needed if promotion is required):
# - If get-asset returned results: build ID is in the output
# - If get-asset returned nothing: use MCP:
# maestro_builds(repository="https://github.com/dotnet/maui", buildNumber="X.Y.Z")
# Or: look for "BAR Build ID" in the AzDO official build summary pageIf no feed is found:
# 3. Verify channels exist for the branch (prefer MCP)
# MCP: maestro_default_channels(repository="https://github.com/dotnet/maui")
# CLI: darc get-default-channels --source-repo https://github.com/dotnet/maui
# 4. STOP — show the user the exact add-build-to-channel command
# and wait for explicit confirmation before running it
# 5. After user approves:
darc add-build-to-channel --id <BAR_BUILD_ID> --channel "<channel>"
# 6. Wait for promotion build (can take several minutes), then re-check
darc get-asset --name Microsoft.Maui.Controls --version X.Y.ZThis means adding the build to the Workload Release channel, which makes assets available on the public dotnet feeds:
get-asset output or AzDO build logs)release/10.0.1xx-sr6 → 10)darc add-build-to-channel --id <BAR_BUILD_ID> --channel ".NET 10 Workload Release"add-build-to-channel command triggers a promotion build that publishes assetsget-asset to checkget-asset shows no feed/channel, the build hasn't been promoted yetmaestro-configuration)This section covers how MAUI's Maestro subscriptions are authored, modified, and retired. The skill above is about querying dependency flow; this section is about changing it.
| Item | Location |
|---|---|
| Org / project / repo | https://dev.azure.com/dnceng/internal/_git/maestro-configuration |
| MAUI-targeted subs | configuration/subscriptions/dotnet-maui.yml |
| Cross-repo per-preview subs | configuration/subscriptions/11.0.1xx-previewN.yml (deleted at preview-ship) |
| Default channel mappings | configuration/default-channels/dotnet-maui.yml and configuration/default-channels/11.0.1xx-previewN.yml |
| Active config branch | production — Maestro/BAR only ingests config from production. Subscriptions are inert until the config PR merges. |
| Target branch | Source repos | Channel | Frequency |
|---|---|---|---|
net10.0 | android, macios | .NET 10.0.1xx SDK | everyBuild |
net10.0 | dotnet | .NET 10.0.1xx SDK | everyDay |
net11.0 | android, macios, dotnet | .NET 11.0.1xx SDK | everyDay, batchable |
net11.0 | dotnet-optimization | .NET 11 | everyWeek |
main | xharness | .NET Eng - Latest | everyWeek |
release/11.0.1xx-previewN (when active) | android, macios | .NET 11.0.1xx SDK Preview N | everyDay, batchable |
Always verify the current state with darc get-subscriptions --target-repo https://github.com/dotnet/maui before making changes — the baseline above ages out.
Preview VMR policy: do not add a
dotnet/dotnetsubscription to arelease/11.0.1xx-previewNbranch. The Maestro preview feed can differ from the official SDK/runtime build selected by the release source of truth. Resolve that official build locally, update MAUI's SDK/VMR pin in a focused PR, and validate the resulting pin directly.
darc add-subscription defaults to opening one PR per call. The cleaner pattern is to share a single topic branch across both calls, review the staged diff, and open ONE PR at the end. Note the explicit review step — without it, an agent can silently create a PR with the wrong channel, target branch, or source repo (the exact failure class this section is trying to prevent).
# Pick a topic branch name once. Quote the assignment so the angle-bracket
# placeholders aren't parsed as shell redirection if literally pasted.
BRANCH="users/<alias>/maui-preview5-subs"
# 1. Stage both subs on the same branch with --no-pr (each call appends one entry).
# Do NOT pass -q here — leave the per-call confirmation prompts in so you eyeball
# each set of inputs (channel, source, target branch) before darc commits.
#
# Always verify
# against the prior preview's production config (`darc get-subscriptions
# --target-repo https://github.com/dotnet/maui --target-branch release/<prev>`)
# before staging. The current preview policy is:
# dotnet/android → everyDay (small daily deltas, batched)
# dotnet/macios → everyDay (small daily deltas, batched)
# dotnet/dotnet → NO SUBSCRIPTION. Reconcile the SDK/VMR pin locally
# against the official release build instead.
for SRC in android macios; do
darc add-subscription \
--no-pr \
--configuration-branch "$BRANCH" \
--channel ".NET 11.0.1xx SDK Preview 5" \
--source-repo "https://github.com/dotnet/$SRC" \
--target-repo https://github.com/dotnet/maui \
--target-branch release/11.0.1xx-preview5 \
--update-frequency everyDay \
--batchable
done# 2. Open ONE PR against production AS DRAFT.
# The draft state IS the review gate — the PR cannot be merged (and the YAML
# cannot be ingested by BAR) until you explicitly mark it ready for review.
# Reviewing in the AzDO "Files changed" UI is more reliable than a local-git
# diff, because `--no-pr --configuration-branch` pushes to
# dnceng/internal/maestro-configuration, not to the maui worktree's `origin`,
# so `git fetch origin "$BRANCH"` / `git diff origin/production...` would not
# work from a dotnet/maui clone (the only context where this skill loads).
PR_ID=$(az repos pr create \
--organization https://dev.azure.com/dnceng \
--project internal \
--repository maestro-configuration \
--source-branch "$BRANCH" \
--target-branch production \
--draft true \
--title "Add subscriptions for .NET 11.0.1xx SDK Preview 5 => dotnet/maui (android, macios)" \
--description "..." \
--query pullRequestId -o tsv)
echo "Draft PR: https://dev.azure.com/dnceng/internal/_git/maestro-configuration/pullrequest/$PR_ID"# 3. REQUIRED gate: open the draft PR's "Files changed" view in AzDO and confirm
# in the diff:
# - Exactly 2 new subscription blocks were added to
# configuration/subscriptions/dotnet-maui.yml
# - Channel string matches the EXACT band+stage for this preview, modulo
# casing of the "Preview"/"preview" token only (see "Channel-name casing
# gotcha" below). For a release/11.0.1xx-preview5 target, the only
# acceptable channels are ".NET 11.0.1xx SDK Preview 5" or
# ".NET 11.0.1xx SDK preview 5". REJECT all of:
# - ".NET 11.0.1xx SDK" (bare — CI-main channel, the
# PR #35364 failure class)
# - ".NET 10.0.1xx SDK Preview 5" (wrong band — would flow 10.x
# assets into an 11.x preview branch)
# - ".NET 11.0.1xx SDK Preview 4" (wrong stage number)
# Pattern: ".NET <band> SDK <Preview|preview> <N>" where <band> matches
# the target branch's band (10.0.1xx, 11.0.1xx, ...) and <N> matches the
# preview number in the target branch name.
# - Source Repository URL is one of dotnet/android or dotnet/macios
# - Target Repository URL is https://github.com/dotnet/maui
# - Target Branch is release/11.0.1xx-preview5
# - Update Frequency: everyDay for android/macios
# - Batchable: true
# - No dotnet/dotnet subscription block is present. SDK/VMR reconciliation is
# local and must use the official release build as its source of truth.
# If any of these are wrong, abandon the draft PR AND start over with a NEW
# $BRANCH name (e.g., append "-v2") before restaging from step 1. Re-running
# step 1 with the same --configuration-branch APPENDS to the existing branch
# rather than replacing it, which produces duplicate or mixed entries that can
# sneak past a casual re-review of the AzDO diff.
# Do NOT mark the PR ready for review until this check passes.# 4. After the human reviewer confirms the diff in the AzDO UI, mark the draft
# PR ready for review (either in the AzDO UI, or via the command below).
az repos pr update --organization https://dev.azure.com/dnceng --id "$PR_ID" --draft false⚠️ add-subscription is in the explicit-confirmation list above — show the user the exact commands and wait for approval before running each step. Never combine all four steps into one un-reviewed script.
Exemplars:
--configuration-branch (cleaner pattern).These historical PRs included a VMR subscription. Use them only for the shared-branch
mechanics; do not copy their dotnet/dotnet block. The current end state is two
subscription blocks (Android + macOS/iOS), normally 16 YAML lines.
Symptom: a Maestro-generated dependency PR targeting release/11.0.1xx-previewN brings in CI-main package stamps instead of preview-stamped builds. Example from PR #35364:
dotnet/android 36.99.0-ci.main.314 (CI-main) instead of a -net11-p5-stamped Preview 5 build.dotnet/macios 26.5.11527-net11-p5 because that's what was on the CI-main channel, not the Preview 5 channel.Root cause: the release/11.0.1xx-previewN branch was fed only by the general .NET 11.0.1xx SDK channel (which collects CI-main builds of the source repos), because no .NET 11.0.1xx SDK Preview N subscription existed yet for MAUI.
Detection during PR review: when reviewing or creating any Maestro PR into a preview branch, confirm the source build's channel matches the target branch's stage in the release cycle. The MAUI repo's preview branches MUST be fed by preview channels, never the general .NET 11.0.1xx SDK channel.
# Quick sanity check
darc get-subscriptions \
--target-repo https://github.com/dotnet/maui \
--target-branch release/11.0.1xx-previewN
# Channel must read ".NET 11.0.1xx SDK Preview N", not ".NET 11.0.1xx SDK"Fix: add Preview N subscriptions per the combined-PR pattern above.
The same channel appears with two casings depending on tool/file:
.NET 11.0.1xx SDK Preview 5 (capital P) — typical in darc output and most YAML.NET 11.0.1xx SDK preview 5 (lowercase p) — appears in some per-preview YAML files (e.g., configuration/subscriptions/11.0.1xx-preview5.yml)Always confirm exact casing before constructing a command:
darc get-channels | grep -i "preview 5"
# or MCP:
maestro_channels(filter="preview 5")darc trigger-subscriptions --id <new-guid> will return not found until the config PR merges into production and BAR ingests it. This is by design — Maestro reads subscription config only from the production branch.
Verify ingestion before triggering:
# Quote <new-guid> so the angle brackets aren't parsed as shell redirection
# if literally pasted.
darc get-subscriptions --ids "<new-guid>"
# If this returns the subscription, BAR has ingested it and trigger-subscriptions will work.Adding batchable subscriptions without merge policies on the target branch produces a darc add-subscription warning. The warning is harmless — Maestro PRs still open. If you skip the policy, each batched PR must be reviewed/merged manually.
🚨 Do NOT run darc set-repository-policies from this skill. That command is in the NEVER run list above because merge-policy changes affect repo security, and an agent should not infer that "documenting it as a narrow exception" amounts to standing authorization. If standard-automerge on a new preview branch is genuinely desired:
darc add-subscription and is non-blocking.set-repository-policies for dotnet/maui) to enable --standard-automerge on the new preview branch.set-repository-policies command yourself, even with confirmation prompts. Hand it off.At the end of a preview cycle, the prior preview's subs and default-channels are bulk-removed in one cleanup PR. This is normal and expected — it keeps the config tidy as previews ship.
Exemplar: PR 61033 (Matt Mitchell, 2026-05-13) removed:
configuration/subscriptions/11.0.1xx-preview2.yml (88 lines)configuration/subscriptions/11.0.1xx-preview4.yml (401 lines)configuration/subscriptions/dotnet-maui.ymlconfiguration/default-channels/When standing up a new preview, confirm the new preview's subs are in place before removing the old preview's to avoid a flow gap.
Use this when asked things like "is .NET MAUI Preview N release-ready?", "which build is the official Preview N?", or "are we good to ship Preview N?" while assessing a preview (not GA or servicing).
Why a special source: the build that releases.dot.net has blessed as the
official preview is designated in an internal .NET Release Tracker plugin.
Public BAR/Maestro data can enumerate candidate builds but cannot, on its own,
tell you which staged build is the blessed one. This is exactly the trap from
PR #35364 / the Preview 6 cycle: two
same-band VMR builds (e.g. …26325.125 vs …26326.122) look interchangeable
until you know which BAR id the release designates.
The plugin lives in a private marketplace repo and is double-gated — you need (1) GitHub read access to that repo to load it, and (2) an authorized Azure AD identity for it to return data. So referencing it from this public repo is safe: a user without access simply can't load it or pull embargoed data.
pwsh ./.github/skills/dependency-flow/scripts/Get-PreviewReleaseReadiness.ps1
# -> RELEASE_TRACKER_STATUS=NO_ACCESS | ACCESS_ON_INACTIVE_ACCOUNT | AVAILABLE_NOT_ENABLED | AVAILABLE_ENABLEDThe script only classifies the environment (GitHub read access + whether the plugin is locally enabled). It fetches no release data and always exits 0.
RELEASE_TRACKER_STATUS | What it means | What to do |
|---|---|---|
AVAILABLE_ENABLED | Caller has access and the dotnet-release-tracker plugin is enabled | Invoke the dotnet-release-tracker skill — it is a Copilot skill/plugin, NOT an MCP server tool, so do not search the MCP tool list for a release-tracker tool and conclude it's unavailable. Run it the normal skill way (it self-documents a PowerShell script — e.g. pwsh scripts/Get-DotNetReleaseStatus.ps1) for the authoritative SDK/runtime + BAR id, then cross-reference with BAR/Maestro for asset/feed details. If the gate says AVAILABLE_ENABLED but the skill isn't loaded in this session yet, reload extensions / restart the session and retry — enabled-but-not-yet-loaded is not a NO_ACCESS condition. |
AVAILABLE_NOT_ENABLED | Caller has access but the plugin is not enabled locally | Tell the user they have access and offer the user-scope opt-in below. After they opt in and reload, re-run Step 1 → AVAILABLE_ENABLED. |
ACCESS_ON_INACTIVE_ACCOUNT | The active gh identity can't read the repo, but a logged-in but inactive gh account (named in reason/inactiveAccount) can — the plugin loads under the active identity, so it still can't be used as-is | Tell the user access exists under <account> and to run gh auth switch --user <account>, then re-run Step 1. Do not invoke the plugin or claim availability under the current identity. (Only appears when access is confirmed on some account, so it never leaks to a true no-access user.) |
NO_ACCESS | Access can't be confirmed on any logged-in account (no access, or gh missing/unauthenticated) | Fall back to PUBLIC data only. For the official-build line, report the latest build promoted to the public .NET 11.0.1xx SDK Preview N channel (public BAR/Maestro) as a display-only candidate, and label it: "source: public preview feed — may not be the final official build." VMR validation remains UNKNOWN: do not compare/update MAUI's VMR pin or render ✅ from this candidate. Do not name or hint at the private plugin/tracker tool, and don't imply the user is missing a tool — see privacy guardrail. |
Source labels (avoid the per-component over-claim): the authoritative release source is SDK/runtime-level only. When access permits, label SDK/runtime version + VMR pin authority → official release source. Label per-component Android/macOS-iOS builds → BAR/Maestro; there is no official-source Android/macOS-iOS build field. Never classify a public-feed SDK/runtime candidate or VMR branch-tip match as authoritative.
Add to the user's personal ~/.copilot/settings.json (merge with existing
keys; this is intentionally not committed to the repo so forks and no-access
users are unaffected):
{
"extraKnownMarketplaces": {
"dotnet-release": { "source": { "source": "github", "repo": "dotnet/release" } }
},
"enabledPlugins": {
"dotnet-release-tracker@dotnet-release": true
}
}Then reload extensions (or restart the session) so the plugin loads.
NO_ACCESS, never reveal, hint at, or
apologize for the private plugin/tracker tool, and never surface embargoed
data (unreleased blessed BAR ids, internal coordinates). This guardrail protects
the tool and its private data — it does not forbid the honest, publicly-true
statement that the public feed's newest build may not be the final official
build (see Honest limitation below). So: answer from public data, label your
source, and caveat its limits — but don't say "there's a gated tracker I can't
reach." The gate script enforces the tier by treating any unconfirmed-access
case as NO_ACCESS.api://…
audiences, backend service hostnames, internal endpoint paths) from the plugin
into this public repo. The only sanctioned reference is the marketplace
pointer (repo name + plugin name) used above..NET 11.0.1xx SDK Preview N
channel as the best-available display-only candidate — but present it
explicitly labeled as feed-sourced, e.g. "🔎 Candidate from the public
Preview N feed (BAR #NNNNNN @ <sha>) — this is the newest build promoted to
the public channel, not a confirmed official (blessed) build; the final
official build is designated at release time and may differ." Give the concrete
candidate + caveat rather than either silently omitting the line or guessing a
single official build. Set VMR validation to UNKNOWN and do not recommend a
pin update until the official SDK/runtime build is known.The blessed-build lookup above answers "which build is official?". These three mechanical checks answer "is the preview branch actually receiving flow, is its promoted feed current, and are the component builds it bundles coherent?" — a preview can have a blessed build yet still be mis-plumbed (branch cut, build exists, but nothing flows in; the feed lags the branch; or its android/macios pins diverged from the inflight branch). Checks A/B and the Android/macOS-iOS half of Check C use public BAR/Maestro + git. Check C's VMR half uses the official SDK/runtime source selected through the access-tier workflow above.
release/11.0.1xx-previewN?Three prerequisites must all hold for the preview to receive dependency flow:
git ls-remote origin refs/heads/release/11.0.1xx-previewN returns a sha.maestro_default_channels(repository="https://github.com/dotnet/maui") (or darc get-default-channels --source-repo https://github.com/dotnet/maui) has an enabled row release/11.0.1xx-previewN → .NET 11.0.1xx SDK Preview N.maestro_subscriptions(targetRepository="https://github.com/dotnet/maui", targetBranch="release/11.0.1xx-previewN") returns the baseline two enabled rows — android + macios (everyDay, batchable), both on channel .NET 11.0.1xx SDK Preview N (see the baseline table above). A dotnet/VMR row is a configuration error, not a missing prerequisite.Interpretation:
| Observed | Meaning | Report |
|---|---|---|
| Branch + default-channel + 2 subs | Fully wired | ✅ OK |
| Branch + default-channel present, 0 subs (or missing android/macios) | Start-of-preview gap: branch cut (possibly with a promoted build already) but the prior preview's subs were never rolled forward — no upstream Android/macOS-iOS flow into the branch | ℹ️ FYI note (not a ship blocker) — name the missing source repos |
| A dotnet/dotnet subscription is present | VMR flow is incorrectly using the Maestro preview feed instead of the official release source of truth | ⚠️ Remove it; reconcile the SDK/VMR pin locally |
| Sub on wrong channel/band/stage/frequency | The PR #35364 mis-wire class (see "Channel-name casing gotcha") | ⚠️ Flag the specific sub |
Remediation (only when the user asks to fix it): stand the missing subs up with the combined-PR pattern above — copy it verbatim, swapping preview5→previewN and Preview 5→Preview N throughout; do not invent new commands, and honor its explicit-confirmation + draft-PR review gate. If the default-channel mapping is also missing, add it first (lifecycle table, row 1). Subs are inert until the maestro-configuration config PR merges to production.
VMR handoff: after Android/macOS-iOS wiring is active, resolve the official
Preview N SDK/runtime build through the release source of truth. Compare it with
MAUI's Microsoft.NET.Sdk / Microsoft.NETCore.App.Ref version and SHA pins,
perform the dependency update locally, and open a focused PR targeting the
Preview N branch. Do not infer the official VMR from the newest Maestro feed build.
"Latest version on the Preview N feed" = the newest MAUI build promoted to the
.NET 11.0.1xx SDK Preview N channel; "what's in .NET MAUI" = the current HEAD of
release/11.0.1xx-previewN.
# feed side (BAR) — the latest build promoted to the preview channel:
# MCP maestro_latest_build(repository="https://github.com/dotnet/maui",
# channelName=".NET 11.0.1xx SDK Preview N") -> .commit
# branch side (git):
git rev-parse origin/release/11.0.1xx-previewNCompare the feed build's commit to the branch HEAD:
| Comparison | Meaning | Report |
|---|---|---|
| Equal | The promoted build is the branch HEAD — feed current | ✅ OK |
Feed commit is an ancestor of the branch HEAD (git merge-base --is-ancestor <feedCommit> origin/release/11.0.1xx-previewN → exit 0, and they differ) | Branch has moved ahead of the last promoted build — feed stale | ⚠️ Flag; report how many commits ahead (git rev-list --count <feedCommit>..origin/release/11.0.1xx-previewN) |
| Feed commit not on the branch | Build promoted from a different ref — investigate, don't guess | ⚠️ Flag |
Version cross-check (optional, human-readable): the branch produces
11.0.0-preview.N.<date>.<rev> (from eng/Versions.props: MajorVersion.MinorVersion.PatchVersion + preview + PreReleaseVersionIteration=N); the feed's latest build should carry the same preview.N stamp. A band/stage mismatch (feed shows preview.5 on a -preview6 branch) is the same mis-wire signal as Check A.
Worked example (net11 Preview 6, live 2026-07-07): maestro_latest_build(".NET 11.0.1xx SDK Preview 6") → build #321033 @ 6e35dc58d0…; git rev-parse origin/release/11.0.1xx-preview6 → 6e35dc58d0… — equal, feed current (produced version 11.0.0-preview.6.*).
MAUI bundles specific dotnet/android, dotnet/macios, and dotnet/dotnet (VMR runtime/SDK) builds, pinned in eng/Version.Details.xml. A natural question for a preview is "which android/macios builds is MAUI shipping — are they the right ones?"
Authority boundary: the
dotnet-release-trackerplugin exposes SDK/runtime-level release data (RuntimeVersion,SdkVersion,Stage, …) but no per-component Android/macOS-iOS build fields. Therefore Android/macOS-iOS cut coherence uses public git + BAR/Maestro, while VMR selection uses the official SDK/runtime build from the release source of truth.
Two authorities, intentionally split. Android/macOS-iOS flow through Preview N subscriptions and can legitimately advance after the MAUI branch is cut. Verify those pins against each component's same-named
release/11.0.1xx-previewNbranch plus the expected Preview N stage/band; do not compare them with mutablenetN.0or require equality with component tip. VMR is different: compare MAUI's SDK/runtime version + SHA with the official SDK/runtime build from the release source of truth. Do not usenetN.0, component branch tip, or the Maestro preview feed to select or validate VMR.
Read the anchor dependencies from the MAUI preview branch. Verify Android/macOS-iOS against their Preview N source branches, then separately compare VMR with the official release build:
# dotnet/android -> Microsoft.Android.Sdk.Windows (android's own scheme, e.g. 37.0.0-ci.main.NN on net11)
# dotnet/macios -> Microsoft.iOS.Sdk.net11.0_26.5 (+ MacCatalyst/macOS/tvOS; 26.5.<build>-net11-pN)
# dotnet/dotnet SDK -> Microsoft.NET.Sdk
# dotnet/dotnet runtime -> Microsoft.NETCore.App.Ref
git show origin/release/11.0.1xx-previewN:eng/Version.Details.xml
# For Android/macOS-iOS, verify the pinned SHA belongs to the same-named
# component release branch. Ahead commits are informational; divergence warns.
# The generated tracker performs this through the GitHub compare API.
#
# Resolve the official SDK/runtime build locally, then compare MAUI's
# Microsoft.NET.Sdk / Microsoft.NETCore.App.Ref version+SHA to that build.Interpretation:
| Observed | Meaning | Report |
|---|---|---|
| Android/macOS-iOS pin is on the component's same-named Preview N branch and has the expected stage/band | Correct component source | ✅ OK |
| Component Preview N branch is ahead of the Android/macOS-iOS pin | Newer component work exists; MAUI need not chase tip unless selected for release | ℹ️ FYI with commit count |
| Android/macOS-iOS pin diverges from the same-named component Preview N branch or has the wrong stage/band | Wrong-source or off-band pin | ⚠️ Flag the component + pin evidence |
| MAUI SDK/runtime pin == the official Preview N build | Correct VMR selected | ✅ OK |
| MAUI SDK/runtime pin differs from the official Preview N build | Local VMR reconciliation is still required, regardless of branch-tip or Maestro state | ⚠️ Flag both version/SHA pairs and update locally |
macOS-iOS pin missing the -net11-pN stamp | Off-band pin (e.g. a -net11-p5 build on a Preview 6 branch) | ⚠️ Flag |
android on -ci.main.NN | Normal for the net11 Android train; validate branch ancestry/source, not the moniker itself | ✅ when sourced from the Preview N component branch |
Anchor note: the automated 🏷️ pins table in the generated tracker issue anchors the VMR on
Microsoft.NET.Sdk(SDK band, e.g.11.0.100-preview.6.*), whereas this manual check readsMicrosoft.NETCore.App.Ref(runtime band, e.g.11.0.0-preview.6.*). Same repo, same commit — different package, so the version strings differ by design. Compare coherence by SHA, not by the version string, when reconciling the two views.
| Phase | Action | Command sketch |
|---|---|---|
| Branch-for-preview (release branch just created) | Add default-channel mapping | darc add-default-channel --channel ".NET 11.0.1xx SDK Preview N" --branch release/11.0.1xx-previewN --repo https://github.com/dotnet/maui |
| Same phase | Add 2 MAUI subs in one PR | Combined-PR pattern (Android + macOS/iOS; see above) |
| Same phase | Optional: enable standard automerge | Hand off to release engineering — do not run set-repository-policies from this skill. See "Optional merge policies for batchable subs" above. |
After the config PR merges to production | Reconcile MAUI's SDK/VMR pin with the official Preview N build | Resolve the official build locally, update the pin in a focused MAUI PR, and verify it before building MAUI; no VMR subscription |
| Mid-cycle | Verify a sub exists | darc get-subscriptions --ids "<guid>" or MCP maestro_subscription(subscriptionId=...) |
| Mid-cycle | Trigger a single sub | darc trigger-subscriptions --id "<guid>" (config PR must be merged first) |
| Preview-ship | Cleanup prior preview | One PR removing the per-preview subscription/default-channel files and the active preview's Android/macOS-iOS blocks from dotnet-maui.yml. Historical PR 61033 also removed legacy VMR blocks. |
For release-readiness summaries, preserve that dependency order exactly: default-channel mapping → Android/macOS-iOS subscriptions → local official SDK/VMR pin reconciliation. Do not add a VMR subscription, and do not include next-preview branch work in the current preview's readiness report.
© dotnet, 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 1 other file (scripts) in .github/skills/dependency-flow of dotnet/maui.
Open the folder on GitHubat commit 7d38fd0
.NET MAUI Dependency Flow Guide 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 |
|---|---|---|---|---|---|---|
| .NET MAUI Dependency Flow Guide this skilldotnet/maui | 23k | — | ~10k | Automated safety check: Pass | MIT | |
| Appllama App Design SkillAppllama/appllama-skills | 2.4k | 1 repos | ~5k | Automated safety check: Pass | MIT | |
| Appllama UsageAppllama/appllama-skills | 2.4k | 1 repos | ~1.6k | Automated safety check: Pass | MIT | |
| Release Sample SweepAtmosphere/atmosphere | 3.8k | — | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Marionette Flutter Drive Appleancodepl/marionette_mcp | 473 | — | ~11k | Automated safety check: Pass | Apache-2.0 | |
| Run Maui Apptig/winprint | 101 | — | ~1.2k | Automated safety check: Pass | MIT |
Appllama/appllama-skills
Build native-feeling, benchmark-quality mobile app screens (Expo / React Native).
Appllama/appllama-skills
Use the Appllama MCP (mcp.appllama.io) well — research real top-grossing mobile apps, their screens, flows, and UI elements, then build from what you learn.
Atmosphere/atmosphere
Run the pre-release end-to-end sweep of every user-facing surface — the 33 samples under samples/ (booted from their packaged artifacts and driven in a real browser via chrome-devtools MCP), the…
leancodepl/marionette_mcp
Set up and drive a running Flutter app (debug or profile) with Marionette — an AI agent's hands and eyes for the app.
tig/winprint
Build, launch, screenshot, and drive the WinPrint.Maui Windows app (winprint.exe) — including UIA automation of the File button and native Open dialog, and pixel capture that works for WinUI3 content.
Redth/Maui.Gtk
End-to-end workflow for building, deploying, inspecting, and debugging .NET MAUI and MAUI Blazor Hybrid apps as an AI agent.
dotnet/maui
Mines local Copilot CLI session logs for dotnet/maui to rank costly or failing runs, tag recurring failure modes, propose repo edits and emit guard evals.
dotnet/maui
Reviews the tests added in a pull request for fix coverage, quality, edge cases and test type, and recommends lighter test types where they would do.
dotnet/maui
Produces evidence-backed ship-readiness verdicts for .NET MAUI Servicing Releases and Previews, and drafts public-safe release handoff pages from the result.
dotnet/maui
Interprets pinned managed benchmark evidence for a dotnet/maui pull request and writes a narrative for the performance review workflow, without running or publishing anything.
dotnet/maui
Checks that a pull request's title and description match its implementation and reviews the code for best practices before merge, without posting anything.
dotnet/maui
Adds dotnet/maui-specific context for investigating failing PR checks and broken nightly builds: pipelines, Helix logs, binlogs and merge-readiness verdicts.
Works with
Categories
Adds MAUI-specific guardrails on top of the maestro-cli skill and Maestro MCP tools for darc, BAR, and channel or feed lookups in dotnet/maui. This skill prefers Maestro MCP tools first, falls back to the mstro CLI from the maestro-cli skill when those tools aren't loaded, and reaches for the darc CLI only for operations neither one covers, such as asset or feed lookups, adding a build to a channel, updating or adding a dependency, and verifying dependencies.
.NET MAUI Dependency Flow Guide fits situations like: looking up which channel a MAUI build belongs to; running a darc operation that Maestro MCP doesn't cover; checking preview release readiness for dotnet/maui.
Run `npx skills add dotnet/maui --skill dependency-flow -a claude-code`. Or copy the skill folder (.github/skills/dependency-flow in dotnet/maui) into .claude/skills/dependency-flow in your project. Claude Code loads it when a task matches its description.
Run `npx skills add dotnet/maui --skill dependency-flow -a codex`. Or copy the skill folder (.github/skills/dependency-flow in dotnet/maui) into .agents/skills/dependency-flow 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 dotnet/maui --skill dependency-flow -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/dependency-flow, .gemini/skills/dependency-flow, .github/skills/dependency-flow and .opencode/skills/dependency-flow in your project.
Going by SKILL.md and its folder, .NET MAUI Dependency Flow Guide needs PowerShell for the scripts in its folder and the command-line tools its instructions call (git, az, pwsh and gh). Our summary lists: darc CLI for operations outside Maestro MCP or mstro; Access to the maestro-cli skill or Maestro MCP tools.
SKILL.md names 2 domains. In commands or code: dev.azure.com and github.com; the agent is likely to contact these 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
.NET MAUI Dependency Flow Guide is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 10k tokens (SKILL.md is roughly 40k 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 .NET MAUI Dependency Flow Guide: Appllama App Design Skill (Appllama/appllama-skills, 2.4k stars), Appllama Usage (Appllama/appllama-skills, 2.4k stars), Release Sample Sweep (Atmosphere/atmosphere, 3.8k stars) and Marionette Flutter Drive App (leancodepl/marionette_mcp, 473 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
dotnet (a GitHub organization, an official publisher) maintains it in dotnet/maui, which has 23,322 GitHub stars. The repository holds 27 skills in this directory. The repository was last updated on October 7, 2026.
Source: dotnet/maui on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.