Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
"url": "https://github.com/microsoft/win-dev-skills"
},
"description": "Agents and skills for native Windows app development with WinUI 3 and the Windows App SDK.",
"version": "0.7.0",
"version": "0.7.1",
"plugins": [
{
"name": "winui",
"description": "Agents and skills for WinUI 3 app development. Create new WinUI 3 desktop apps, convert from other frameworks to WinUI 3, or add features to existing WinUI 3 applications.",
"version": "0.7.0",
"version": "0.7.1",
"source": "./plugins/winui",
"category": "windows-development",
"tags": [
Expand Down
13 changes: 13 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,16 @@ updates:

cooldown:
default-days: 7

# vally skill linter (pinned to match github/awesome-copilot's marketplace gate)
- package-ecosystem: "npm"
directory: "/scripts/vally"
schedule:
interval: "weekly"
day: "monday"
open-pull-requests-limit: 2
labels:
- "dependencies"
commit-message:
prefix: "ci"
include: "scope"
4 changes: 2 additions & 2 deletions .github/plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
},
"metadata": {
"description": "Agents and skills for native Windows app development with WinUI 3 and the Windows App SDK.",
"version": "0.7.0"
"version": "0.7.1"
},
"plugins": [
{
"name": "winui",
"description": "Agents and skills for WinUI 3 app development. Create new WinUI 3 desktop apps, convert from other frameworks to WinUI 3, or add features to existing WinUI 3 applications.",
"version": "0.7.0",
"version": "0.7.1",
"source": "./plugins/winui/agent-plugin"
}
]
Expand Down
18 changes: 18 additions & 0 deletions .github/workflows/pr-validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,24 @@ jobs:
shell: pwsh
run: ./scripts/tests/Test-SetupVersionDetection.ps1

vally-lint:
name: Marketplace skill lint (vally)
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup Node
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 22

# Same linter and version github/awesome-copilot runs on external plugins.
- name: Lint skills
run: |
npm ci --prefix scripts/vally --no-audit --no-fund
node scripts/vally/lint-skills.mjs

validate-plugin-manifest:
name: Validate Agent Plugins package
runs-on: ubuntu-latest
Expand Down
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,14 @@ The `version-bump` and `changelog-entry` CI jobs enforce this.

### Deprecated

## [0.7.1] — 2026-09-30

### Fixed

- Replace cross-skill markdown links with plain-text skill names so each skill
is self-contained and passes marketplace link validation (vally `valid-refs`),
which blocked the awesome-copilot listing update. CI now enforces this.

## [0.7.0] — 2026-09-30

### Added
Expand Down
8 changes: 8 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ check will (correctly) refuse to let the version-bump diff land on staging.
| `staging-up-to-date-with-main` | PR targets `staging` | PR head contains every commit on `main` (back-merge PRs satisfy this naturally). |
| `powershell-tests` | Any PR | Session classification, documented Sandbox test-script behavior, and setup version detection pass focused regression tests. |
| `validate-plugin-manifest` + `validate-skill-frontmatter` | Any PR | Manifests are well-formed, every `SKILL.md` has valid frontmatter. |
| `vally-lint` | Any PR | Skills pass the same [vally](https://github.com/microsoft/vally) lint marketplaces run (e.g. awesome-copilot). Links in a `SKILL.md` must stay inside that skill's folder — name other skills in plain text. |

If a check fails, the failure message tells you exactly what to fix.

Expand All @@ -152,6 +153,13 @@ pwsh -NoProfile -File .\scripts\tests\Test-WinuiUiTestingSandbox.ps1
pwsh -NoProfile -File .\scripts\tests\Test-SetupVersionDetection.ps1
```

To run the marketplace skill lint locally (Node 22+):

```powershell
npm ci --prefix scripts/vally
node scripts/vally/lint-skills.mjs
```

These checks do not replace exercising the published CLI/analyzer with a real
app before releasing changed build, packaging, AOT, or Sandbox guidance.

Expand Down
4 changes: 2 additions & 2 deletions RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ If the helper doesn't work for some reason:

Before merging:

- ✅ All status checks green (`powershell-tests`, `version-bump`,
- ✅ All status checks green (`powershell-tests`, `vally-lint`, `version-bump`,
`changelog-entry`).
- ✅ External tools the skills depend on (WinApp CLI, the analyzer NuGet
package) are published at the versions the skills require.
Expand Down Expand Up @@ -171,7 +171,7 @@ the CI workflows alone are not enough.

2. **Branch protection on `staging`** (CRITICAL — strict mode is REQUIRED, not optional):
- Require PR before merging.
- Require status checks: `powershell-tests`,
- Require status checks: `powershell-tests`, `vally-lint`,
`validate-plugin-manifest`,
`validate-skill-frontmatter`, `version-sync`,
`staging-up-to-date-with-main`.
Expand Down
2 changes: 1 addition & 1 deletion plugins/winui/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "winui",
"description": "Agents and skills for WinUI 3 app development. Create new WinUI 3 desktop apps, convert from other frameworks to WinUI 3, or add features to existing WinUI 3 applications.",
"version": "0.7.0",
"version": "0.7.1",
"author": {
"name": "Microsoft",
"url": "https://github.com/microsoft/win-dev-skills"
Expand Down
2 changes: 1 addition & 1 deletion plugins/winui/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "winui",
"version": "0.7.0",
"version": "0.7.1",
"description": "Agents and skills for WinUI 3 app development. Create new WinUI 3 desktop apps, convert from other frameworks to WinUI 3, or add features to existing WinUI 3 applications.",
"author": {
"name": "Microsoft",
Expand Down
2 changes: 1 addition & 1 deletion plugins/winui/agent-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "winui",
"description": "Agents and skills for WinUI 3 app development. Create new WinUI 3 desktop apps, convert from other frameworks to WinUI 3, or add features to existing WinUI 3 applications.",
"version": "0.7.0",
"version": "0.7.1",
"author": {
"name": "Microsoft",
"url": "https://github.com/microsoft/win-dev-skills"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ Run a code review **after the app builds and before committing**. This catches q

### How to Review

Read through the project's XAML and C# files and check each section below. For analyzer setup, see [winui-dev-workflow](../winui-dev-workflow/SKILL.md); if it isn't installed, tell the user its checks didn't run.
Read through the project's XAML and C# files and check each section below. For analyzer setup, see `winui-dev-workflow`; if it isn't installed, tell the user its checks didn't run.

Before reporting an API mismatch or recommending a replacement, verify it against the **restored app project's** references with CLI 0.7+ `winapp find-api`, for example `winapp find-api members NavigationView --filter selected --json --project-dir <app-project-dir>`. See [winui-design](../winui-design/SKILL.md) for batch property checks and project selection; machine-SDK results are not proof of app-package availability.
Before reporting an API mismatch or recommending a replacement, verify it against the **restored app project's** references with CLI 0.7+ `winapp find-api`, for example `winapp find-api members NavigationView --filter selected --json --project-dir <app-project-dir>`. See `winui-design` for batch property checks and project selection; machine-SDK results are not proof of app-package availability.

The analyzer catches a curated set of WinUI 3 / Windows App SDK issues with categorized 4-digit IDs:

Expand Down Expand Up @@ -42,7 +42,7 @@ Use the installed package's diagnostic help links for rule details. Check inheri
### Native AOT / Trimming (When Intended)

- [ ] The published artifact was tested (a Release JIT run is not AOT validation), with IL/CsWinRT warnings fixed rather than suppressed
- [ ] ABI-crossing types are partial; JSON and runtime bindings use source generation — see [source-generator patterns](../winui-packaging/references/sourcegen-patterns.md)
- [ ] ABI-crossing types are partial; JSON and runtime bindings use source generation — see `winui-packaging`'s `references/sourcegen-patterns.md`

### Accessibility

Expand Down
2 changes: 1 addition & 1 deletion plugins/winui/agent-plugin/skills/winui-design/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ Don't size the window by setting `Width`/`Height` on the root `Grid` — that cl
<TextBlock Text="{x:Bind Vm.Status, Mode=OneWay}" />
```

In a page/window, `x:Bind` resolves against code-behind (e.g., its `Vm` property), not `DataContext`. Use `x:DataType` on typed **DataTemplates**, not on `Page` to set a VM. Runtime `{Binding}`/`DisplayMemberPath` can be appropriate; for AOT, their source classes may need `partial` plus `[WinRT.GeneratedBindableCustomProperty]`. See [source-generator patterns](../winui-packaging/references/sourcegen-patterns.md) instead of treating all runtime binding as unsupported.
In a page/window, `x:Bind` resolves against code-behind (e.g., its `Vm` property), not `DataContext`. Use `x:DataType` on typed **DataTemplates**, not on `Page` to set a VM. Runtime `{Binding}`/`DisplayMemberPath` can be appropriate; for AOT, their source classes may need `partial` plus `[WinRT.GeneratedBindableCustomProperty]`. See `winui-packaging`'s `references/sourcegen-patterns.md` instead of treating all runtime binding as unsupported.

### `TextBox` two-way needs `UpdateSourceTrigger=PropertyChanged`

Expand Down
10 changes: 5 additions & 5 deletions plugins/winui/agent-plugin/skills/winui-dev-workflow/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,14 @@ dotnet add .\MyApp.csproj package Microsoft.Windows.SDK.BuildTools.WinUIAnalyzer

Keep `PrivateAssets="all"` on the reference. It loads in normal CLI, IDE, and CI builds; WinApp CLI does not inject it. If the package is unavailable, continue and tell the user its checks for potential runtime issues did not run. Undo only an incomplete reference added by this attempt; do not remove existing references or hide other restore failures.

For other packages, prefer the latest stable unless the project has a version policy or the user requests a specific version. Before coding API assumptions, use `winapp find-api` scoped to the restored app with `--project-dir <app-project-dir>` (or `--project <name>` in a solution); see [winui-design](../winui-design/SKILL.md).
For other packages, prefer the latest stable unless the project has a version policy or the user requests a specific version. Before coding API assumptions, use `winapp find-api` scoped to the restored app with `--project-dir <app-project-dir>` (or `--project <name>` in a solution); see `winui-design`.

### Build & Run (JIT Development)

```powershell
winapp run . --detach --json
```
For UI testing, see [winui-ui-testing](../winui-ui-testing/SKILL.md), which chooses the execution target itself.
For UI testing, see `winui-ui-testing`, which chooses the execution target itself.

Ordinary `winapp run` uses the build/JIT path, **even with `-c Release`**; it does not validate Native AOT. Use an explicit `.csproj` when project selection is ambiguous; see `winapp run --help` for options.

Expand All @@ -48,7 +48,7 @@ For intended AOT deployment, set `<PublishAot>true</PublishAot>` in the app proj
winapp run . --aot -c Release --arch <x64|arm64> --detach --json
winapp run . --aot -c Release --arch <x64|arm64> -p PublishAot=true --detach --json
```
Fix IL/CsWinRT warnings rather than suppressing them. See [AOT/source-generator patterns](../winui-packaging/references/sourcegen-patterns.md).
Fix IL/CsWinRT warnings rather than suppressing them. See `winui-packaging`'s `references/sourcegen-patterns.md`.

### Diagnosing Crashes

Expand Down Expand Up @@ -82,7 +82,7 @@ Run attached with `--debug-output` and **invoke it with `mode: "async"`**, then
| WinApp CLI | 0.7+ |
| Native AOT only | MSVC C++ build tools (Visual Studio or Build Tools, **Desktop development with C++** workload, target-architecture tools); not needed for normal builds |

If WinApp CLI is missing or older than 0.7, install or upgrade it using [winui-setup](../winui-setup/SKILL.md) without asking (it needs no admin rights) and tell the user. Ask before installing anything that needs admin rights — the .NET SDK, Developer Mode, or the [Native AOT toolchain](https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/); do not work around them.
If WinApp CLI is missing or older than 0.7, install or upgrade it using `winui-setup` without asking (it needs no admin rights) and tell the user. Ask before installing anything that needs admin rights — the .NET SDK, Developer Mode, or the [Native AOT toolchain](https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/); do not work around them.

### Critical Rules

Expand All @@ -93,4 +93,4 @@ If WinApp CLI is missing or older than 0.7, install or upgrade it using [winui-s

### References

- [winui-packaging](../winui-packaging/SKILL.md) — release packaging directly from the project; no development registration required.
- `winui-packaging` — release packaging directly from the project; no development registration required.
6 changes: 3 additions & 3 deletions plugins/winui/agent-plugin/skills/winui-packaging/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: winui-packaging
description: "MSIX packaging, code signing, and distribution for WinUI 3 apps with WinApp CLI 0.7+ — SDK-native project packaging, Native AOT, certificates, self-contained deployment, CI/CD, and Microsoft Store handoff. Use when preparing for release, creating MSIX installers, managing certificates, setting up CI/CD packaging, or publishing to the Microsoft Store."
---

Requires **WinApp CLI 0.7+**. For analyzer setup, see [winui-dev-workflow](../winui-dev-workflow/SKILL.md).
Requires **WinApp CLI 0.7+**. For analyzer setup, see `winui-dev-workflow`.

### Quick Reference

Expand All @@ -23,7 +23,7 @@ Requires **WinApp CLI 0.7+**. For analyzer setup, see [winui-dev-workflow](../wi
- Pass the **explicit project file**, not `.` or a guessed `bin` folder. WinUI project packaging uses SDK-native `dotnet publish` packaging, defaults to **Release**, and preserves project AOT settings.
- Check manifest identity, target architectures, the SDK for the app's TFM, and release warnings.
- For Native AOT, set `<PublishAot>true</PublishAot>` in the project and fix IL/CsWinRT warnings; there is **no `winapp package --aot`**. AOT also needs the MSVC C++ build tools. See [source-generator patterns](references/sourcegen-patterns.md).
- Project packaging rejects `WindowsPackageType=None`; restore the packaged setting first (see [winui-dev-workflow](../winui-dev-workflow/SKILL.md) Critical Rules).
- Project packaging rejects `WindowsPackageType=None`; restore the packaged setting first (see `winui-dev-workflow` Critical Rules).

Do **not** run/register/unregister a development package just to produce release artifacts. Project packaging builds without a development `winapp run --no-launch` step. For WinUI SDK-native packaging, do not pass layout overrides `--manifest`, `--executable`, or `--skip-pri`; fix the project/manifest instead.

Expand Down Expand Up @@ -55,7 +55,7 @@ winapp sign .\MyApp.msix .\prod.pfx --timestamp http://timestamp.digicert.com
`--timestamp` belongs to **`winapp sign`**, not `winapp package`. Use an approved timestamp service and protect the PFX/password.

#### Step 5: Install or Distribute
When installation/testing is part of the task, choose the target per [winui-ui-testing](../winui-ui-testing/SKILL.md) Step 1, and get consent for certificate trust and dependency provisioning on that machine. Packaging alone is not permission to install an app.
When installation/testing is part of the task, choose the target per `winui-ui-testing` Step 1, and get consent for certificate trust and dependency provisioning on that machine. Packaging alone is not permission to install an app.

### Self-Contained Does Not Mean Single-File

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Source Generator Patterns — Detailed Reference

Patterns for Native AOT and trimming in WinUI 3. See [SKILL.md](../SKILL.md) for project packaging and [winui-dev-workflow](../../winui-dev-workflow/SKILL.md) for analyzer setup and publish runs.
Patterns for Native AOT and trimming in WinUI 3. See [SKILL.md](../SKILL.md) for project packaging and `winui-dev-workflow` for analyzer setup and publish runs.

---

Expand Down
2 changes: 1 addition & 1 deletion plugins/winui/agent-plugin/skills/winui-setup/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ If the user declines or dismisses UAC, continue to the summary and print the com

Report these separately from the base toolchain. `winapp target snapshot sandbox --json` inspects an existing
guest without starting or repairing it; "no target running" alone does not
mean the Windows feature is unavailable. [winui-ui-testing](../winui-ui-testing/SKILL.md)
mean the Windows feature is unavailable. `winui-ui-testing`
Step 1 defines what to do when Windows Sandbox is unavailable.

Enabling Windows Sandbox is a **user action** (admin plus a reboot): ask the user
Expand Down
4 changes: 2 additions & 2 deletions plugins/winui/agent-plugin/skills/winui-ui-testing/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ description: "Automated UI testing for Windows desktop apps — generate a batch

Windows Sandbox keeps synthetic input off the user's desktop; target selection is in Step 1. Discover the installed contract with `winapp run --help`, `winapp target --help`, and `winapp ui <verb> --help`. Use `--on sandbox`, not `--sandbox` or a top-level `sandbox` command. Do not enable Windows features or launch an app without the task's permission.

- Prerequisites and enablement: see [winui-setup](../winui-setup/SKILL.md).
- Prerequisites and enablement: see `winui-setup`.
- Project builds/publishes execute on the **host**; deployment, app launch, and `ui --on sandbox` execute in the **guest**. Run the batch script below on the host, not inside `target exec` (which would double-route).
- Real input and capture require an unlocked host and a connected, nonminimized Sandbox client. Tree inspection may work while input cannot; a readable tree is not an input-readiness check.
- `winapp target snapshot sandbox --json` is a read-only readiness query: it neither starts nor reconnects a guest. Use it to diagnose readiness rather than probing the user's desktop.
Expand All @@ -24,7 +24,7 @@ Core verbs: `list-windows`, `inspect`, `search`, `get-property`, `get-value`, `w

### Step 1: Select a target, then keep the PID and target together

Prefer `sandbox` when Windows Sandbox is available; otherwise tell the user and choose `local`. **If the user explicitly requested Windows Sandbox and it is unavailable, stop** and point them to the enablement steps in [winui-setup](../winui-setup/SKILL.md). A stopped guest does not prove unavailability: `target snapshot` can report no running target while the feature is enabled. App build/test failures are not Sandbox unavailability. The same policy applies to diagnostics: unpackaged apps can't use guest `--debug-output`, so diagnose them locally unless Sandbox was explicitly requested.
Prefer `sandbox` when Windows Sandbox is available; otherwise tell the user and choose `local`. **If the user explicitly requested Windows Sandbox and it is unavailable, stop** and point them to the enablement steps in `winui-setup`. A stopped guest does not prove unavailability: `target snapshot` can report no running target while the feature is enabled. App build/test failures are not Sandbox unavailability. The same policy applies to diagnostics: unpackaged apps can't use guest `--debug-output`, so diagnose them locally unless Sandbox was explicitly requested.

Pass the selected target to the template: it launches with `winapp run . --on sandbox --detach --json` for a guest, or omits `--on sandbox` for local execution. Reuse an already-running app only when its captured target matches the selected target and the guest has not been recreated. Never pass a guest PID to default-host `winapp ui`. If a target becomes unavailable after selection, report it and select again under the same policy; the script itself never retries in another target.

Expand Down
Loading
Loading