Skip to content

Commit 26aa303

Browse files
nmetulevCopilotJaylyn-Barbee
authored
Update WinUI skills for WinApp CLI 0.6 (#145)
* Update skills for WinApp CLI 0.6 Adopt winapp new, find-ui, and project-mode run while removing the superseded bundled winui-search tool and simplifying BuildAndRun.ps1. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 418fd91b-b050-438c-b3d3-b26c00bdeeea * Rely on WinGet for WinApp CLI Remove the temporary standalone release fallback; WinApp CLI 0.6 will be published to WinGet before these skills ship. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 418fd91b-b050-438c-b3d3-b26c00bdeeea * Fix skill regressions from the WinApp CLI 0.6 migration Review of the WinApp CLI 0.6 update surfaced three regressions where behavior previously enforced by tooling was dropped or demoted to prose. winui-packaging: Step 1 had switched from the BuildAndRun.ps1 wrapper to raw `dotnet build`, which does not load the bundled Microsoft.WindowsAppSDK.Analyzers -- so release builds lost the analyzer gate that development builds get. Restore the wrapper using the new flag surface (`--no-launch` replaces the removed `-SkipRun`). Unlike the old build-only path, `--no-launch` also registers a development package, so note the `winapp unregister` step before installing the signed MSIX. The GitHub Actions example stays on `dotnet build` -- the wrapper registers packages and needs the plugin's local analyzer payload, neither of which belongs on a runner. winui-design: the skill absorbed sample and control discovery via `winapp find-ui` when winui-search.exe was removed, but its description never gained matching trigger phrases, so sample-search requests no longer activate it. winui-dev-workflow: the 0x80073CF9 troubleshooting row replaced an automatic MAX_PATH guard that keyed the staging directory on a hash of the output path and purged it before reuse. The replacement was keyed on app name alone with no purge, so Debug and Release now collide in one directory that a registered development package holds a live reference to. Re-encode both invariants in the guidance. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: b05a748c-f1f9-4159-84d2-d66d401a6067 --------- Co-authored-by: Nikola Metulev <711864+nmetulev@users.noreply.github.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Co-authored-by: Jaylyn Barbee <51131738+Jaylyn-Barbee@users.noreply.github.com> Copilot-Session: 418fd91b-b050-438c-b3d3-b26c00bdeeea Copilot-Session: b05a748c-f1f9-4159-84d2-d66d401a6067
1 parent e257293 commit 26aa303

62 files changed

Lines changed: 443 additions & 6237 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/ISSUE_TEMPLATE/bug-report.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ body:
3232
- "skill: winui-session-report"
3333
- "skill: winui-wpf-migration"
3434
- "tool: winui-analyzer (Roslyn)"
35-
- "tool: winui-search"
3635
- "tool: winmd-cli"
3736
- "area: plugin / install"
3837
- "area: docs"

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ The `pr-target-policy` CI check enforces this.
2929

3030
<!-- Check all that apply -->
3131

32-
- [ ] Agent (`plugins/winui/agents/`)
32+
- [ ] Agent (`plugins/winui/agents/`, `plugins/winui/agent-plugin/com.github.copilot/agents/`)
3333
- [ ] Skill: <!-- name(s) -->
34-
- [ ] Tool: <!-- winui-analyzer / winui-search / winmd-cli -->
34+
- [ ] Tool: <!-- winui-analyzer / winmd-cli -->
3535
- [ ] Plugin metadata (`plugin.json`, `plugins/winui/`)
3636
- [ ] Repo-level docs / governance
3737

.github/codeql/codeql-config.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,3 @@ paths-ignore:
66
- '**/*Tests/*.cs'
77
- '**/bin/**'
88
- '**/obj/**'
9-
- 'src/tools/winui-search/Data/**'

.github/dependabot.yml

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,20 +45,6 @@ updates:
4545
prefix: "deps"
4646
include: "scope"
4747

48-
# winui-search CLI (gallery + toolkit scenario search)
49-
- package-ecosystem: "nuget"
50-
directory: "/src/tools/winui-search"
51-
schedule:
52-
interval: "weekly"
53-
day: "monday"
54-
open-pull-requests-limit: 5
55-
labels:
56-
- "dependencies"
57-
- "tool: winui-search"
58-
commit-message:
59-
prefix: "deps"
60-
include: "scope"
61-
6248
# winmd-cli (WinMD inspector)
6349
- package-ecosystem: "nuget"
6450
directory: "/src/tools/winmd-cli"

.github/skills/pr-review/SKILL.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@ This repo is **not a regular C# product**. It ships:
1616
prompt + skill prompts (`SKILL.md` files). These are **Tier 3 instructions**
1717
that agents frequently ignore (see `dimensions/skill-tool-boundary.md`).
1818
Adding prose here is the *last resort*, not the first response to any problem.
19-
- Three **in-repo C# tools** under `src/tools/` — the WinUI 3 Roslyn analyzer,
20-
`winmd-cli`, and `winui-search`. These are **Tier 1 enforcement** and the
21-
preferred place to land behavior changes.
22-
- **Committed binary payloads** (analyzer DLL, `winui-search.exe`,
23-
`Microsoft.WindowsAppSDK.Analyzers.targets`) inside `plugins/winui/agent-plugin/skills/`
19+
- Two **in-repo C# tools** under `src/tools/` — the WinUI 3 Roslyn analyzer
20+
and `winmd-cli`. These are **Tier 1 enforcement** and the preferred place
21+
to land behavior changes that belong in this repository.
22+
- **Committed analyzer payloads** (DLL and
23+
`Microsoft.WindowsAppSDK.Analyzers.targets`) inside
24+
`plugins/winui/agent-plugin/skills/`
2425
that must stay in sync with their sources. CI provenance jobs will fail
2526
the PR if they drift, but it's better to flag the drift in review.
2627

@@ -114,14 +115,13 @@ focus. Common buckets in this repo:
114115
| `plugins/winui/agent-plugin/skills/<name>/references/` | skill-content (references discipline) |
115116
| `plugins/winui/agent-plugin/skills/<name>/*.ps1` (e.g. `BuildAndRun.ps1`, `Analyze-Session.ps1`) | tool-correctness, payloads-and-tests |
116117
| `plugins/winui/agent-plugin/skills/winui-dev-workflow/analyzer/` | payloads-and-tests (committed analyzer payload) |
117-
| `plugins/winui/agent-plugin/skills/winui-design/winui-search.exe` | payloads-and-tests (committed AOT exe) |
118-
| `plugins/winui/agents/winui-dev.agent.md` | skill-content, docs-and-manifests |
118+
| `plugins/winui/{agents,agent-plugin/com.github.copilot/agents}/winui-dev.agent.md` | skill-content, docs-and-manifests |
119119
| `plugins/winui/agent-plugin/plugin.json` | docs-and-manifests |
120120
| `.github/plugin/marketplace.json` | docs-and-manifests |
121121
| `src/tools/winui-analyzer/Microsoft.WindowsAppSDK.Analyzers/` | tool-correctness, payloads-and-tests |
122122
| `src/tools/winui-analyzer/Microsoft.WindowsAppSDK.Analyzers.Tests/` | payloads-and-tests |
123123
| `src/tools/winui-analyzer/RULES.md` / `CHANGELOG.md` | docs-and-manifests |
124-
| `src/tools/winmd-cli/`, `src/tools/winui-search/` | tool-correctness |
124+
| `src/tools/winmd-cli/` | tool-correctness |
125125
| `scripts/build-tools.ps1` | payloads-and-tests |
126126
| `.github/workflows/` | docs-and-manifests (CI), payloads-and-tests (provenance) |
127127
| `README.md`, `SECURITY.md`, `SUPPORT.md` | docs-and-manifests |
@@ -234,7 +234,7 @@ verdict.
234234
- **No file output.** Stdout only, unless the user explicitly asked for a
235235
file.
236236
- **No build/test execution.** Flag staleness (analyzer DLL not refreshed,
237-
`winui-search.exe` not refreshed, `RULES.md` not updated) but do not run
237+
`RULES.md` not updated) but do not run
238238
`scripts/build-tools.ps1` or `dotnet test` yourself — they are slow and
239239
the contributor will run them.
240240
- **Signal-to-noise.** Reject sub-agent findings that are pure style nits,

.github/skills/pr-review/dimensions/_shared-contract.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ high. The bar for adding tooling enforcement is lower.
9898
is too scenario-specific.
9999
- Trigger-phrasing problems in `description:` frontmatter that would
100100
cause the wrong agent activation.
101-
- Stale committed payloads (analyzer DLL, `winui-search.exe`,
101+
- Stale committed analyzer payloads (DLL or
102102
`Microsoft.WindowsAppSDK.Analyzers.targets`) that will fail CI
103103
provenance.
104104
- Manifest / version / agent-file drift that ships broken artifacts to
@@ -136,8 +136,8 @@ change should land. Cite the tier on every `skill-content` and
136136

137137
| Tier | Type | Reliability | Examples in this repo |
138138
|------|------|-------------|------------------------|
139-
| **0** | Environment / harness defaults | Highest — agent never sees it | `dotnet new` template choice, `BuildAndRun.ps1` defaults, prerequisite checks in `winui-setup` |
140-
| **1** | Tooling enforcement | High — produces errors/warnings the agent must address | `Microsoft.WindowsAppSDK.Analyzers` rules, `winui-search.exe` query results, `winmd.exe` API verification, `winapp` CLI exit codes |
139+
| **0** | Environment / harness defaults | Highest — agent never sees it | `winapp new` template choice, `BuildAndRun.ps1` defaults, prerequisite checks in `winui-setup` |
140+
| **1** | Tooling enforcement | High — produces errors/warnings the agent must address | `Microsoft.WindowsAppSDK.Analyzers` rules, `winapp find-ui` query results, `winmd.exe` API verification, `winapp` CLI exit codes |
141141
| **2** | Templates / scaffolding | Medium — structural, applied at creation time | `Microsoft.WindowsAppSDK.WinUI.CSharp.Templates`, starter project files |
142142
| **3** | Instructions / skills | Lowest — advisory, frequently ignored | `SKILL.md` content, `winui-dev.agent.md` rules, `references/*.md` |
143143

.github/skills/pr-review/dimensions/docs-and-manifests.md

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,14 @@ When code or skills change, these need to keep up:
2121
- `plugins/winui/{.claude-plugin,.codex-plugin}/plugin.json` and
2222
`openclaw.plugin.json` — legacy-client adapters pointing to the canonical
2323
`agent-plugin/skills/` directory.
24-
- `plugins/winui/agents/winui-dev.agent.md` — the orchestrator agent
25-
prompt; mentions specific skills by name and lists default-loaded
26-
skills.
24+
- `plugins/winui/agents/winui-dev.agent.md` and
25+
`plugins/winui/agent-plugin/com.github.copilot/agents/winui-dev.agent.md`
26+
compatibility and Copilot orchestrator prompts; mention specific skills by
27+
name and list default-loaded skills.
2728
- `src/tools/winui-analyzer/RULES.md` — rule catalog (per-rule entry
2829
required for every shipped diagnostic; IDs are immutable).
2930
- `src/tools/winui-analyzer/CHANGELOG.md` — analyzer-scoped changelog.
30-
- Per-tool READMEs: `src/tools/{winui-analyzer,winmd-cli,winui-search}/README.md`.
31+
- Per-tool READMEs: `src/tools/{winui-analyzer,winmd-cli}/README.md`.
3132
- `SECURITY.md`, `SUPPORT.md`, `THIRD_PARTY_NOTICES.md`,
3233
`cgmanifest.json` — only relevant when dependencies or contact
3334
surfaces change.
@@ -40,10 +41,10 @@ When code or skills change, these need to keep up:
4041

4142
- **New skill added under `plugins/winui/agent-plugin/skills/<new>/`** without a
4243
matching row in `README.md`'s "eight skills" table → **high**.
43-
- **Skill renamed.** `plugins/winui/agents/winui-dev.agent.md`
44-
references skills by name (e.g. "Load the `winui-dev-workflow`
45-
skill"). Renames must update every mention in the agent file
46-
*and* in any sibling skill that links to it. **high**.
44+
- **Skill renamed.** Both orchestrator agent files reference skills by name
45+
(e.g. "Load the `winui-dev-workflow` skill"). Renames must update every
46+
mention in both agent files and in any sibling skill that links to it.
47+
**high**.
4748
- **Skill removed without README update.** Same as above, inverse.
4849
- **Skill description copy doesn't match `description:` frontmatter.**
4950
README's table is hand-curated; the canonical text lives in the
@@ -102,7 +103,7 @@ When code or skills change, these need to keep up:
102103
walks `find plugins/winui/agent-plugin/skills -type f -name SKILL.md`. New
103104
skills outside this glob won't be validated → **medium**.
104105
- Any CI step's hardcoded file path
105-
(e.g. `plugins/winui/agent-plugin/skills/winui-design/winui-search.exe`)
106+
(e.g. `plugins/winui/agent-plugin/skills/winui-dev-workflow/analyzer/Microsoft.WindowsAppSDK.Analyzers.dll`)
106107
changed in the diff but not in the workflow → **high**.
107108

108109
### Other docs

.github/skills/pr-review/dimensions/payloads-and-tests.md

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,20 @@ Set `Domain: payloads-and-tests` on every finding.
66

77
## What this dimension owns
88

9-
This repo commits **prebuilt binary payloads** alongside source for
10-
two of its tools, and the CI `pr-validation` workflow has provenance
11-
jobs that fail the PR if those payloads drift from source. This
12-
dimension's job is to flag drift *before* the contributor pushes.
9+
This repo commits the analyzer's **prebuilt payloads** alongside source,
10+
and the CI `pr-validation` workflow has provenance jobs that fail the PR
11+
if those payloads drift from source. This dimension's job is to flag
12+
drift *before* the contributor pushes.
1313

1414
The payloads:
1515

1616
| Payload (committed) | Source | CI job that catches drift |
1717
|---|---|---|
1818
| `plugins/winui/agent-plugin/skills/winui-dev-workflow/analyzer/Microsoft.WindowsAppSDK.Analyzers.dll` | `src/tools/winui-analyzer/Microsoft.WindowsAppSDK.Analyzers/` | `analyzer-provenance` (sha256 + size delta) |
1919
| `plugins/winui/agent-plugin/skills/winui-dev-workflow/analyzer/Microsoft.WindowsAppSDK.Analyzers.targets` | `src/tools/winui-analyzer/Microsoft.WindowsAppSDK.Analyzers/Microsoft.WindowsAppSDK.Analyzers.targets` | `analyzer-targets-sync` (byte-identical) |
20-
| `plugins/winui/agent-plugin/skills/winui-design/winui-search.exe` | `src/tools/winui-search/` | `winui-search-provenance` (smoke + size ±10%) |
2120

22-
Refresh command: `./scripts/build-tools.ps1` (no flags) rebuilds all
23-
three tools and refreshes both payloads. The contributor will run
21+
Refresh command: `./scripts/build-tools.ps1` (no flags) rebuilds both
22+
C# tools and refreshes the analyzer payloads. The contributor will run
2423
this — you only flag drift.
2524

2625
## What to look for
@@ -39,21 +38,11 @@ this — you only flag drift.
3938
Same pattern but for
4039
`Microsoft.WindowsAppSDK.Analyzers.targets`. CI
4140
`analyzer-targets-sync` requires byte-identical files. → **high**.
42-
- **`winui-search` source touched, exe not refreshed.** Diff
43-
includes `src/tools/winui-search/**` *but not*
44-
`plugins/winui/agent-plugin/skills/winui-design/winui-search.exe`**high**.
45-
CI `winui-search-provenance` runs smoke tests (`list`, `search
46-
tabview` → must include `gallery-tabview`) and a ±10% size
47-
comparison.
4841
- **Payload-only change (no source).** The inverse — committed DLL
49-
or exe updated without a corresponding source diff. Either the
42+
or `.targets` updated without a corresponding source diff. Either the
5043
source was already on `main` (fine — this is a refresh PR) or
5144
someone hand-edited the binary (red flag). → **medium**, ask the
5245
contributor to confirm.
53-
- **`winui-search` data files updated without rebuild.** Diff
54-
touches `src/tools/winui-search/Data/*.json` *but not* the
55-
committed exe. The data is **embedded** at build time — JSON
56-
changes have no effect until the exe is republished. → **high**.
5746

5847
### Analyzer test coverage
5948

@@ -124,10 +113,8 @@ findings, but additionally:
124113

125114
## Severity guide for this dimension
126115

127-
- Source touched but committed payload not refreshed (DLL, .targets,
128-
or exe) → **high** (CI provenance will fail).
129-
- `winui-search` data JSON edited without exe rebuild → **high**
130-
(the change is invisible at runtime).
116+
- Source touched but committed payload not refreshed (DLL or .targets)
117+
**high** (CI provenance will fail).
131118
- New analyzer rule with no test → **high**.
132119
- New tool not wired into `build-tools.ps1`**medium**.
133120
- Allowlist change without regression test → **medium**.

.github/skills/pr-review/dimensions/skill-content.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ This dimension reviews **prose changes** to:
1414
- `plugins/winui/agent-plugin/skills/<name>/SKILL.md` (the 8 shipped skills)
1515
- `plugins/winui/agent-plugin/skills/<name>/references/*.md` (deep-dive references
1616
loaded on demand)
17-
- `plugins/winui/agents/winui-dev.agent.md` (the orchestrator agent
18-
prompt)
17+
- `plugins/winui/agents/winui-dev.agent.md` and
18+
`plugins/winui/agent-plugin/com.github.copilot/agents/winui-dev.agent.md`
19+
(orchestrator agent prompts)
1920
- `.github/skills/<name>/SKILL.md` (repo-internal skills like this one)
2021

2122
The audience for this content is **AI coding agents** (Copilot CLI,
@@ -62,7 +63,7 @@ priors. Every line of prose must pull its weight.
6263
re-state rules already covered in a sibling skill — link or
6364
reference instead. Flag when the same checklist appears twice.
6465
- **Restating help text.** Bullets that re-document what `winapp
65-
--help`, `winui-search list`, or `winmd --help` already prints are
66+
--help`, `winapp find-ui --help`, or `winmd --help` already prints are
6667
pure context inflation.
6768
- **"Best practices" laundry lists** with no concrete change in agent
6869
behavior (e.g. "follow YAGNI / DRY / KISS") — these are universally
@@ -89,8 +90,8 @@ priors. Every line of prose must pull its weight.
8990
read.
9091
- **References that should be tool data.** A long reference file that
9192
is essentially a catalogue of WinUI controls, snippets, or API
92-
signatures duplicates `winui-search.exe`'s data. Flag and emit a
93-
paired `skill-tool-boundary` finding (Tier 1 alternative).
93+
signatures duplicates `winapp find-ui` or `winmd` data. Flag and emit
94+
a paired `skill-tool-boundary` finding (Tier 1 alternative).
9495

9596
### Trigger / activation hygiene
9697

.github/skills/pr-review/dimensions/skill-tool-boundary.md

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ consider them before defaulting to Tier 3 prose.
2020

2121
| Tier | Type | Reliability | In-repo examples |
2222
|------|------|-------------|-------------------|
23-
| **0** | Environment / harness defaults | Highest — agent never sees it | `dotnet new` template choice baked into `winui-dev-workflow`, `BuildAndRun.ps1` defaults, `winui-setup` prerequisite checks |
24-
| **1** | Tooling enforcement | High — produces diagnostics agent must address | `Microsoft.WindowsAppSDK.Analyzers` rules (WUI0xxx-WUI4xxx), `winui-search.exe` queries, `winmd.exe` API verification, `winapp` CLI exit codes |
23+
| **0** | Environment / harness defaults | Highest — agent never sees it | `winapp new` template choice, `BuildAndRun.ps1` defaults, `winui-setup` prerequisite checks |
24+
| **1** | Tooling enforcement | High — produces diagnostics agent must address | `Microsoft.WindowsAppSDK.Analyzers` rules (WUI0xxx-WUI4xxx), `winapp find-ui` queries, `winmd.exe` API verification, `winapp` CLI exit codes |
2525
| **2** | Templates / scaffolding | Medium — structural, applied once | `Microsoft.WindowsAppSDK.WinUI.CSharp.Templates`, starter `.csproj` defaults |
2626
| **3** | Instructions / skills | Lowest — advisory, frequently ignored | `SKILL.md` content, `winui-dev.agent.md` rules, `references/*.md` |
2727

@@ -53,19 +53,22 @@ This is the most common drift. Symptoms:
5353
This is what `winmd.exe` is for — recommend invoking it from the
5454
skill instead of duplicating the rule.
5555
- A new list of **WinUI control names or sample patterns**. This is
56-
what `winui-search.exe` is for. The skill should *describe how to
56+
what `winapp find-ui` is for. The skill should *describe how to
5757
query* the tool, not embed the catalogue.
58-
- A new bullet that says **"after building, do X"**. This usually
59-
belongs in `BuildAndRun.ps1` (Tier 0) so the agent gets it for free.
58+
- A new bullet that says **"after building, do X"**. General build/run
59+
behavior belongs in the upstream `winapp` command so every caller gets it;
60+
reserve `BuildAndRun.ps1` for analyzer injection and diagnostic defaults.
6061
- A new "common error" entry that boils down to a missing prerequisite
6162
— that belongs in `winui-setup` (Tier 0/1).
6263

6364
For each such finding:
6465
- Severity: **medium** (would be high if the analyzer/tool clearly
6566
could enforce it but the contributor chose prose).
6667
- Recommendation: name the specific Tier 1 hook — "Add an analyzer
67-
rule under `WUI20xx` (runtime/layout/XAML pitfalls)", "Extend
68-
`winui-search` index", "Add a step to `BuildAndRun.ps1`".
68+
rule under `WUI20xx` (runtime/layout/XAML pitfalls)", "Improve the
69+
upstream `winapp find-ui` corpus", or "Improve the relevant upstream
70+
`winapp` subcommand". Recommend `BuildAndRun.ps1` only for analyzer or
71+
diagnostic-default behavior.
6972

7073
### Skill prose that should be a Tier 2 (template) change
7174

@@ -139,9 +142,6 @@ Less common but real:
139142
than a real WinUI pitfall. Analyzer noise erodes trust in the
140143
whole catalog. Recommend converting to skill guidance (Tier 3) or
141144
dropping.
142-
- A new `winui-search` synonym hack that encodes a single
143-
contributor's mental model rather than a generally useful query
144-
alias.
145145
- A new `winmd-cli` flag that exists only to match one skill's exact
146146
output format — couplings like this should be inverted (skill
147147
adapts to tool, not vice versa).
@@ -179,8 +179,9 @@ justification, the addition is misplaced — emit a finding.
179179

180180
- New skill prose duplicating an existing analyzer rule → **medium**
181181
(Tier 3, recommend cite-the-rule-instead).
182-
- New skill prose that should clearly have been a new analyzer rule
183-
/ new `winui-search` data / new `BuildAndRun.ps1` step → **high**
182+
- New skill prose that should clearly have been a new analyzer rule,
183+
an upstream `winapp find-ui` improvement, or a new `BuildAndRun.ps1`
184+
step → **high**
184185
if the change is large and the Tier 1 path is straightforward;
185186
**medium** otherwise.
186187
- New skill prose that should clearly have been a `winapp` CLI

0 commit comments

Comments
 (0)