$npx -y skills add Christian-Katzmann/app-it --skill app-it-windowsCreate Windows beta desktop launchers for local web projects: WPF + WebView2 .exe, Start Menu shortcut, .ico, warm server, quit cleanup. Use when the user asks for app-it-windows, a Windows app, .exe launcher, Start Menu shortcut, Windows package, or desktop icon. CI-guarded but
| 1 | # app-it-windows - Make a project launchable on Windows (beta) |
| 2 | |
| 3 | **Windows beta: scaffolded, untested on real hardware, maintainer wanted.** |
| 4 | |
| 5 | The macOS `app-it` lane is proven. This Windows sibling mirrors the contract |
| 6 | with Windows primitives, but every runtime behavior that needs a real Windows |
| 7 | desktop must be marked deferred: `this needs a Windows maintainer - see |
| 8 | docs/WINDOWS.md`. |
| 9 | |
| 10 | ## Non-Negotiables |
| 11 | |
| 12 | 1. Run `templates/inspect.ps1` first and read the output before editing. |
| 13 | 2. Trust disk over docs. Verify project type, scripts, ports, and desktop |
| 14 | signals from files. |
| 15 | 3. Build everything a Mac or CI can build; never claim Windows runtime behavior |
| 16 | works unless it was verified on real Windows hardware. |
| 17 | 4. Prefer the WPF + WebView2 host. Edge `--app=` is a fallback, not the default. |
| 18 | 5. Keep Windows visibly beta in every report and user-facing summary. |
| 19 | 6. Copy shipped templates and customize through `scripts\app-it.config.json`. |
| 20 | Do not re-derive launcher patterns. |
| 21 | 7. Verify build/lint/config checks, then list hardware-only checks as deferred. |
| 22 | |
| 23 | ## Reference Map |
| 24 | |
| 25 | Open only what the inspection or chosen path needs: |
| 26 | |
| 27 | - `references/maintainer-contract.md` - what a Mac can produce, what must be |
| 28 | deferred, and the exact Windows-maintainer phrase. |
| 29 | - `references/inspection-and-strategies.md` - project inspection, toolchain |
| 30 | probes, strategy tree, W-Native, W-Edge, W-Static, W-Multi, B, and D. |
| 31 | - `references/generated-files.md` - template roster, allowed target files, |
| 32 | config JSON, package scripts, and Start Menu destination. |
| 33 | - `references/wrapper-host.md` - WebView2 host, lifecycle, Job Object ownership, |
| 34 | single-instance behavior, and wrapper argument contract. |
| 35 | - `references/verification.md` - buildable checks, Windows-only checks, and |
| 36 | deferred rows. |
| 37 | - `references/report-template.md` - exact beta report format. |
| 38 | |
| 39 | ## Templates |
| 40 | |
| 41 | Templates live next to this file in `templates/`. Copy them into the target |
| 42 | project and keep their contracts intact: |
| 43 | |
| 44 | ```text |
| 45 | templates/ |
| 46 | wrapper-windows/ |
| 47 | desktop-build.ps1 |
| 48 | desktop-install.ps1 |
| 49 | desktop-quit.ps1 |
| 50 | inspect.ps1 |
| 51 | run-template.ps1 |
| 52 | run-template-edge.ps1 |
| 53 | desktop-icons.ps1 |
| 54 | placeholder-icon-gen.ps1 |
| 55 | PSScriptAnalyzerSettings.psd1 |
| 56 | app-it.config.example.json |
| 57 | ``` |
| 58 | |
| 59 | The comments inside templates encode Windows traps: PATH augmentation, |
| 60 | WebView2/.NET prerequisites, free-port probing, Job Object ownership, Start Menu |
| 61 | shortcuts, SmartScreen, and icon-cache behavior. Read the matching reference |
| 62 | before changing launcher internals. |
| 63 | |
| 64 | ## Workflow |
| 65 | |
| 66 | ### 1. Inspect |
| 67 | |
| 68 | Run the bundled probe from the target project root: |
| 69 | |
| 70 | ```powershell |
| 71 | pwsh -File path\to\plugins\app-it-windows\skills\app-it-windows\templates\inspect.ps1 |
| 72 | ``` |
| 73 | |
| 74 | Read `references/inspection-and-strategies.md` before deciding project shape, |
| 75 | ports, existing desktop tooling, names, icons, or strategy. |
| 76 | |
| 77 | ### 2. Decide |
| 78 | |
| 79 | For each user-facing app: |
| 80 | |
| 81 | ```text |
| 82 | Existing Electron/Tauri/NW.js Windows target? |
| 83 | yes -> Strategy B |
| 84 | no -> native desktop requirement beyond web shell? |
| 85 | yes -> Strategy D |
| 86 | no -> .NET 8 buildable and WebView2 expected? |
| 87 | no -> W-Edge fallback |
| 88 | yes -> static built bundle, no server? |
| 89 | yes -> W-Static |
| 90 | no -> cohabiting frontend + backend? |
| 91 | yes -> W-Multi |
| 92 | no -> W-Native (default) |
| 93 | ``` |
| 94 | |
| 95 | WebView2 is Chromium, so File System Access and other Chromium APIs are reasons |
| 96 | to prefer the WPF host, not reasons for a polyfill. |
| 97 | |
| 98 | ### 3. Build |
| 99 | |
| 100 | Touch as little project surface as possible. Copy the selected templates, write |
| 101 | `scripts\app-it.config.json`, add `desktop:*` package scripts, and generate the |
| 102 | `.ico`/published output when tooling is present. |
| 103 | |
| 104 | Read `references/generated-files.md` before editing scripts/config/docs, and |
| 105 | `references/wrapper-host.md` before changing the host or PowerShell lifecycle. |
| 106 | |
| 107 | ### 4. Verify |
| 108 | |
| 109 | On macOS, only claim buildable evidence: .NET publish when available, |
| 110 | PowerShell lint when available, manifest/config parse, and placeholder icon |
| 111 | round-trip in Windows CI. Everything involving a real window, Taskbar identity, |
| 112 | tray Quit, Start Menu icon cache, SmartScreen, DPI, or Job Object tree reaping |
| 113 | stays deferred with the maintainer phrase. |
| 114 | |
| 115 | Read `references/verification.md` before reporting results. |
| 116 | |
| 117 | ### 5. Report |
| 118 | |
| 119 | Use `references/report-template.md` inline and in |
| 120 | `docs\desktop-launcher.app-it-report.md`. Keep beta wording visible, separate |
| 121 | build/lint evidence from runtime unknowns, and append decision h |