From 3031bf6f206ad35c3d9db580f0fbd380a77312e7 Mon Sep 17 00:00:00 2001 From: Sharla Soennichsen Date: Wed, 27 May 2026 18:15:55 -0700 Subject: [PATCH 1/5] Align docs, manifest, and comments with current repo state - Rename calm-os -> windows-dev-config throughout (flow id, test dir, install shim, manifest, comments) - Fix manifest install/configuration paths to use src/ prefix consistently (CI runs unsigned source, not signed top-level copies) - Fix development.md: correct title, DSC resource type names, path references, repo layout tree, table alignment, spelling - Remove stale mac-comfort-shell / mac-my-wsl references from comments - Remove orphaned src/tests/wsl-comfort-shell/ directory - Update cmdpal README category examples --- src/Workloads/_common/apply-configuration.ps1 | 2 +- src/docs/development.md | 147 +++++++++--------- .../QuickWingetSetup/Models/ScriptEntry.cs | 2 +- .../Pages/ScriptDetailPage.cs | 6 +- src/future/cmdpal/README.md | 2 +- src/manifest.yml | 50 +++--- .../expected.txt | 0 .../{calm-os => windows-dev-config}/probe.ps1 | 2 +- src/tests/wsl-comfort-shell/expected.txt | 1 - src/tests/wsl-comfort-shell/hello.sh | 10 -- src/windows-dev-config/install.ps1 | 10 +- 11 files changed, 114 insertions(+), 118 deletions(-) rename src/tests/{calm-os => windows-dev-config}/expected.txt (100%) rename src/tests/{calm-os => windows-dev-config}/probe.ps1 (94%) delete mode 100644 src/tests/wsl-comfort-shell/expected.txt delete mode 100644 src/tests/wsl-comfort-shell/hello.sh diff --git a/src/Workloads/_common/apply-configuration.ps1 b/src/Workloads/_common/apply-configuration.ps1 index 9f8b949..54412e4 100644 --- a/src/Workloads/_common/apply-configuration.ps1 +++ b/src/Workloads/_common/apply-configuration.ps1 @@ -36,7 +36,7 @@ param( [Parameter(Mandatory)] [string] $Id, [Parameter(Mandatory)] [string] $ConfigFile, # AllowEmptyCollection: Windows PowerShell 5.1 rejects empty arrays - # bound to Mandatory parameters. Some flows (e.g. mac-comfort-shell) + # bound to Mandatory parameters. Some flows (e.g. comfort-shell) # have no post-install CLI to verify - the DSC only installs a font # and pwsh - so they legitimately pass @() here. [Parameter(Mandatory)] [AllowEmptyCollection()] [string[]] $RequireCommands diff --git a/src/docs/development.md b/src/docs/development.md index 9364fca..4914739 100644 --- a/src/docs/development.md +++ b/src/docs/development.md @@ -1,4 +1,4 @@ -# WindowsDevSetupScripts — Developer Guide +# WindowsDeveloperConfig — Developer Guide > 👋 **Just want to run something?** See the > [top-level README](../../README.md). This file is the contributor / @@ -8,13 +8,13 @@ Opinionated, CI-validated configurations for bootstrapping developer toolchains and Windows-desktop personalities using `winget` / `winget configure`. -On Windows the **core artifact of each flow is a [winget DSC configuration +On Windows, the **core artifact of each flow is a [winget DSC configuration file](https://learn.microsoft.com/windows/package-manager/configuration/)** (`configuration.winget` for language toolchains, `dev-config.winget` for the -Calm OS flow) — a declarative, idempotent description of the machine state +clean development configuration) — a declarative, idempotent description of the machine state required for that flow. Where winget alone is not enough (e.g. `npm install --global typescript`, registry tweaks, or a `RunOnce` reboot dance) the -configuration calls a DSC `Script` / `RunCommandOnSet` / `Registry` +configuration calls a DSC `RunCommandOnSet` / `PowerShellScript` / `Registry` resource, so everything the flow needs lives in one YAML file. A small `install.ps1` shim next to it applies the config with `winget configure` and handles session-level glue (PATH refresh, CI sentinel). @@ -27,7 +27,7 @@ configuration actually produced a working toolchain. ## Supported flows -Each flow's `configuration.winget` (or `dev-config.winget` for Calm OS) +Each flow's `configuration.winget` (or `dev-config.winget`) is the source of truth for what gets installed; the table below summarizes it for quick scanning. Flows marked **manual** are excluded from the automated CI matrix (they need an interactive desktop session @@ -46,13 +46,13 @@ extension. | Python | ✅ automated | `Python.Python.3.13`, `astral-sh.uv` | | WinForms | 🙋 manual | `Microsoft.DotNet.SDK.10` + the .NET desktop workload (multi-GB; manual to spare CI minutes) | | WinUI 3 | 🙋 manual | `Microsoft.DotNet.SDK.10`, `Microsoft.VisualStudio.Community`, `Microsoft.WinAppCLI` + WinUI/Universal/ManagedDesktop VS workloads | -| Calm OS | 🙋 manual | A full distraction-free workstation: apps + ~24 registry tweaks + WSL + Ubuntu (see [`windows-dev-config/README.md`](../windows-dev-config/README.md)) | +| Windows Dev Config | 🙋 manual | A full distraction-free workstation: apps + ~24 registry tweaks + WSL + Ubuntu (see [`windows-dev-config/README.md`](../windows-dev-config/README.md)) | | Comfort Shell | 🙋 manual | WSL distro + zsh/bash + starship + modern CLI bundle + Cascadia Code Nerd Font + themed Windows Terminal profile (see [`wsl-comfort/readme.md`](../wsl-comfort/readme.md)) | See [`manifest.yml`](../manifest.yml) for the canonical declarative list (paths, build/run commands, onboarding URLs). -## Command Palette extension +## Command Palette extension (coming soon) A [PowerToys Command Palette](https://learn.microsoft.com/windows/powertoys/command-palette/overview) extension lives under [`future/cmdpal/`](../future/cmdpal/). It reads the same @@ -66,41 +66,48 @@ for build + configuration details. ## Repository layout +All source lives under `src/`. The top-level `Workloads/`, +`windows-dev-config/`, and `wsl-comfort/` directories are signed release +copies — see [Signed vs source](#repo-layout-signed-vs-source) below. + ``` -Workloads/ - _common/ # shared PowerShell shim helpers (retry, refresh PATH, preflight, assert-winget-configure, apply-configuration) - typescript/ # configuration.winget (core) + install.ps1 (thin shim) - php/ # configuration.winget (core) + install.ps1 (thin shim) - python/ # configuration.winget (core) + install.ps1 (thin shim) - dotnet/ # configuration.winget (core) + install.ps1 (thin shim) - go/ # configuration.winget (core) + install.ps1 (thin shim) - java/ # configuration.winget (core) + install.ps1 (thin shim) - rust/ # configuration.winget (core) + install.ps1 (thin shim) - winforms/ # configuration.winget (core) + install.ps1 (thin shim) - winui/ # configuration.winget (core) + install.ps1 (thin shim) -windows-dev-config/ # Calm OS — dev-config.winget (single-file DSC) + install.ps1 + README.md -wsl-comfort/ # Comfort Shell — install.ps1 (Windows side) + comfort-shell-bootstrap.sh (Linux side, self-contained) + readme.md -tests/ - _harness/ # build-run-diff harness used by CI: - # run-flow.ps1 - all flows (build + run + diff stdout) - # run-server.ps1 - helper for future server scenarios - # (kept idle; no flow currently uses it) - typescript/ # hello.ts + expected.txt - php/ # hello.php + expected.txt - python/ # hello.py + expected.txt - dotnet/ # hello.csproj + Program.cs + expected.txt - go/ # hello.go + expected.txt - java/ # Hello.java + expected.txt - rust/ # Cargo.toml + src/main.rs + expected.txt - winforms/ # hello.csproj + Program.cs + expected.txt - winui/ # hello.csproj + Program.cs + expected.txt - calm-os/ # probe.ps1 + expected.txt (manual-only flow) - comfort-shell/ # hello.sh + expected.txt (manual-only flow) -manifest.yml # declarative list of flows consumed by CI **and** by the extension -future/ - cmdpal/ # PowerToys Command Palette extension (reads manifest.yml) +src/ + Workloads/ + _common/ # shared PowerShell shim helpers (retry, refresh PATH, preflight, assert-winget-configure, apply-configuration) + typescript/ # configuration.winget (core) + install.ps1 (thin shim) + php/ # configuration.winget (core) + install.ps1 (thin shim) + python/ # configuration.winget (core) + install.ps1 (thin shim) + dotnet/ # configuration.winget (core) + install.ps1 (thin shim) + go/ # configuration.winget (core) + install.ps1 (thin shim) + java/ # configuration.winget (core) + install.ps1 (thin shim) + rust/ # configuration.winget (core) + install.ps1 (thin shim) + winforms/ # configuration.winget (core) + install.ps1 (thin shim) + winui/ # configuration.winget (core) + install.ps1 (thin shim) + windows-dev-config/ # Windows Dev Config — dev-config.winget (single-file DSC) + install.ps1 + README.md + wsl-comfort/ # Comfort Shell — install.ps1 (Windows side) + comfort-shell-bootstrap.sh (Linux side, self-contained) + readme.md + tests/ + _harness/ # build-run-diff harness used by CI: + # run-flow.ps1 - all flows (build + run + diff stdout) + # run-server.ps1 - helper for future server scenarios + # (kept idle; no flow currently uses it) + typescript/ # hello.ts + expected.txt + php/ # hello.php + expected.txt + python/ # hello.py + expected.txt + dotnet/ # hello.csproj + Program.cs + expected.txt + go/ # hello.go + expected.txt + java/ # Hello.java + expected.txt + rust/ # Cargo.toml + src/main.rs + expected.txt + winforms/ # hello.csproj + Program.cs + expected.txt + winui/ # hello.csproj + Program.cs + expected.txt + windows-dev-config/ # probe.ps1 + expected.txt (manual-only flow) + comfort-shell/ # hello.sh + expected.txt (manual-only flow) + manifest.yml # declarative list of flows consumed by CI **and** by the extension + future/ + cmdpal/ # PowerToys Command Palette extension (reads manifest.yml) + docs/ + development.md # this file .github/workflows/ - ci.yml # discover -> per-OS matrix -> summary + ci.yml # discover -> per-OS matrix -> summary ``` ## Repo layout: signed vs source @@ -176,11 +183,11 @@ winget configure --file ./Workloads/typescript/configuration.winget ` session and prints a CI-friendly sentinel: ```powershell -./Workloads/typescript/install.ps1 -./tests/_harness/run-flow.ps1 -Id typescript ` - -Build 'tsc tests/typescript/hello.ts' ` - -Run 'node tests/typescript/hello.js' ` - -Expected tests/typescript/expected.txt +./src/Workloads/typescript/install.ps1 +./src/tests/_harness/run-flow.ps1 -Id typescript ` + -Build 'tsc src/tests/typescript/hello.ts' ` + -Run 'node src/tests/typescript/hello.js' ` + -Expected src/tests/typescript/expected.txt ``` ## Testing and verifying locally @@ -201,11 +208,11 @@ These don't touch your machine state and are a good pre-commit pass: ```bash # DSC YAML parses and has the expected shape. -python3 -c "import yaml; yaml.safe_load(open('Workloads/typescript/configuration.winget'))" -python3 -c "import yaml; yaml.safe_load(open('Workloads/php/configuration.winget'))" +python3 -c "import yaml; yaml.safe_load(open('src/Workloads/typescript/configuration.winget'))" +python3 -c "import yaml; yaml.safe_load(open('src/Workloads/php/configuration.winget'))" # manifest.yml parses (this is what CI's `discover` job consumes). -python3 -c "import yaml; print(yaml.safe_load(open('manifest.yml')))" +python3 -c "import yaml; print(yaml.safe_load(open('src/manifest.yml')))" ``` ```powershell @@ -222,7 +229,7 @@ If you have [PSScriptAnalyzer](https://github.com/PowerShell/PSScriptAnalyzer) installed, also run: ```powershell -Invoke-ScriptAnalyzer -Recurse -Path ./Workloads, ./tests/_harness +Invoke-ScriptAnalyzer -Recurse -Path ./src/Workloads, ./src/tests/_harness ``` ### 2. Validate the DSC config without applying it (Windows) @@ -233,7 +240,7 @@ desired state — useful for "will this config do what I think?" without actually installing anything: ```powershell -winget configure test --file ./Workloads/typescript/configuration.winget ` +winget configure test --file ./src/Workloads/typescript/configuration.winget ` --accept-configuration-agreements ` --disable-interactivity ``` @@ -248,37 +255,37 @@ This is exactly what CI does and is the definitive local test: ```powershell # a) Apply the DSC config via the shim (this is what CI invokes). -./Workloads/typescript/install.ps1 +./src/Workloads/typescript/install.ps1 # Expected tail of output: "INSTALL_OK: typescript" # b) Build + run the hello-world and diff its stdout against expected.txt. -./tests/_harness/run-flow.ps1 -Id typescript ` - -Build 'tsc tests/typescript/hello.ts' ` - -Run 'node tests/typescript/hello.js' ` - -Expected tests/typescript/expected.txt +./src/tests/_harness/run-flow.ps1 -Id typescript ` + -Build 'tsc src/tests/typescript/hello.ts' ` + -Run 'node src/tests/typescript/hello.js' ` + -Expected src/tests/typescript/expected.txt # Expected tail of output: "FLOW_OK: typescript" # c) Re-run the install to prove idempotence — it should succeed again and # report no packages changed. -./Workloads/typescript/install.ps1 +./src/Workloads/typescript/install.ps1 ``` Swap `typescript` for `php` (and the matching build/run args from -[`manifest.yml`](../manifest.yml)) to verify the PHP flow the same way. +[`src/manifest.yml`](../manifest.yml)) to verify the PHP flow the same way. ### 4. Drive every flow from the manifest (Windows) -If you're changing something shared (`Workloads/_common/*.ps1`, the harness, +If you're changing something shared (`src/Workloads/_common/*.ps1`, the harness, or the manifest schema) and want to exercise every flow the way CI will: ```powershell -$flows = (ConvertFrom-Yaml (Get-Content -Raw ./manifest.yml)).flows | +$flows = (ConvertFrom-Yaml (Get-Content -Raw ./src/manifest.yml)).flows | Where-Object { $_.os -contains 'windows' -and -not $_.manual_test } foreach ($f in $flows) { Write-Host "=== $($f.id) ===" & $f.windows.install - ./tests/_harness/run-flow.ps1 ` + ./src/tests/_harness/run-flow.ps1 ` -Id $f.id ` -Build ($f.windows.build ?? '') ` -Run $f.windows.run ` @@ -288,18 +295,18 @@ foreach ($f in $flows) { `ConvertFrom-Yaml` comes from the `powershell-yaml` module (`Install-Module powershell-yaml -Scope CurrentUser`). If you don't want that -dependency, just copy the build/run strings out of `manifest.yml` by hand. +dependency, just copy the build/run strings out of `src/manifest.yml` by hand. ### 5. Validating CI itself -To sanity-check a change to `.github/workflows/ci.yml` or `manifest.yml` +To sanity-check a change to `.github/workflows/ci.yml` or `src/manifest.yml` without a full CI round-trip, run `discover`'s Python block locally — it will reject malformed flows with the same error CI would: ```bash python3 - <<'PY' import yaml, json -doc = yaml.safe_load(open("manifest.yml")) +doc = yaml.safe_load(open("src/manifest.yml")) for flow in doc.get("flows", []): for os_name in flow.get("os", []): spec = flow.get(os_name) or {} @@ -313,18 +320,18 @@ PY Adding a language is a **data change**, not a workflow change: -1. Add a `configuration.winget` at `Workloads//` describing the +1. Add a `configuration.winget` at `src/Workloads//` describing the winget packages and any PowerShell (via `Microsoft.DSC.Transitional/RunCommandOnSet` - or `PSDscResources/Script` resources) needed to reach the desired state. - This file is the core artifact — it should be readable on its own and - applyable with `winget configure`. + or `Microsoft.DSC.Transitional/PowerShellScript` resources) needed to reach + the desired state. This file is the core artifact — it should be readable + on its own and applied directly with `winget configure`. 2. Add a thin `install.ps1` shim next to it that delegates to - `Workloads/_common/apply-configuration.ps1` with the flow id, config + `src/Workloads/_common/apply-configuration.ps1` with the flow id, config path, and list of commands that must be on PATH afterwards. The shim ends with `INSTALL_OK: `, which CI asserts on. -3. Add a hello world under `tests//` together with an `expected.txt` +3. Add a hello world under `src/tests//` together with an `expected.txt` containing its exact stdout. -4. Append an entry to `manifest.yml` describing the build command, run +4. Append an entry to `src/manifest.yml` describing the build command, run command, and expected-output path for each supported OS. That's it — `discover` in CI picks up the new flow automatically. diff --git a/src/future/cmdpal/QuickWingetSetup/QuickWingetSetup/Models/ScriptEntry.cs b/src/future/cmdpal/QuickWingetSetup/QuickWingetSetup/Models/ScriptEntry.cs index ec559be..c0038f9 100644 --- a/src/future/cmdpal/QuickWingetSetup/QuickWingetSetup/Models/ScriptEntry.cs +++ b/src/future/cmdpal/QuickWingetSetup/QuickWingetSetup/Models/ScriptEntry.cs @@ -116,7 +116,7 @@ public class WindowsTarget /// Optional PowerShell step that runs in the same Windows Terminal tab /// after winget configure succeeds. Use when a flow's DSC /// installs the machine-side prerequisites but the real setup is an - /// interactive script (e.g. mac-my-wsl.ps1 -Interactive). The + /// interactive script (e.g. comfort-shell-bootstrap.sh). The /// script path is repo-relative; args are appended verbatim. /// [JsonPropertyName("postConfigure")] diff --git a/src/future/cmdpal/QuickWingetSetup/QuickWingetSetup/Pages/ScriptDetailPage.cs b/src/future/cmdpal/QuickWingetSetup/QuickWingetSetup/Pages/ScriptDetailPage.cs index ed5531c..3b9bfc5 100644 --- a/src/future/cmdpal/QuickWingetSetup/QuickWingetSetup/Pages/ScriptDetailPage.cs +++ b/src/future/cmdpal/QuickWingetSetup/QuickWingetSetup/Pages/ScriptDetailPage.cs @@ -34,7 +34,7 @@ public override IListItem[] GetItems() var winSubtitle = $"winget configure {winPath}"; // Flows that need WSL even though they register as Windows-only - // (e.g. mac-comfort-shell installs a font via DSC but the + // (e.g. comfort-shell installs a font via DSC but the // follow-up manual step runs inside a WSL distro). Surface the // same ⚠️ affordances we show on Linux items. if (_script.RequiresWsl) @@ -191,8 +191,8 @@ public override ICommandResult Invoke() return CommandResult.Dismiss(); } - // Resolve an optional post-configure step (e.g. mac-my-wsl.ps1 - // -Interactive) and chain it in the same wt tab so the user gets + // Resolve an optional post-configure step (e.g. comfort-shell-bootstrap.sh) + // and chain it in the same wt tab so the user gets // one continuous experience instead of a manual follow-up. string? postPath = null; string? postArgs = null; diff --git a/src/future/cmdpal/README.md b/src/future/cmdpal/README.md index d1111d6..124e4ec 100644 --- a/src/future/cmdpal/README.md +++ b/src/future/cmdpal/README.md @@ -37,7 +37,7 @@ The list view groups by `category`, with this priority order: | 1 | `languages` | Language toolchains (typescript, python, dotnet, ...).| | 2 | `desktop` | Desktop frameworks on top of a language (winforms, winui). | | 3 | (other / default) | Any unrecognized category sorts here. | -| 4 | `user-experience` | OS-feel flows (common-adjustments, mac-comfort-shell, calm-os). | +| 4 | `user-experience` | OS-feel flows (windows-dev-config, comfort-shell). | | 4 | `shell` | Legacy alias for `user-experience`. New flows should pick `user-experience`. | Within a rank, flows sort alphabetically by category then by name. diff --git a/src/manifest.yml b/src/manifest.yml index 083142b..e372e25 100644 --- a/src/manifest.yml +++ b/src/manifest.yml @@ -26,7 +26,7 @@ # - "user-experience" : OS-feel / shell flows that # shape the desktop rather than # install dev toolchains -# (wsl-comfort, calm-os, +# (wsl-comfort, windows-dev-config, # common-adjustments). # - "shell" : legacy alias for # "user-experience"; new flows @@ -114,9 +114,9 @@ flows: manual_test: true os: [windows] windows: - install: Workloads/winforms/install.ps1 - configuration: Workloads/winforms/configuration.winget - build: dotnet build src/tests/winforms/hello.csproj -c Release -v q --nologo -o tests/winforms/bin + install: src/Workloads/winforms/install.ps1 + configuration: src/Workloads/winforms/configuration.winget + build: dotnet build src/tests/winforms/hello.csproj -c Release -v q --nologo -o src/tests/winforms/bin run: src\tests\winforms\bin\hello.exe expected: src/tests/winforms/expected.txt version: "dotnet --version" @@ -134,8 +134,8 @@ flows: manual_test: true os: [windows] windows: - install: Workloads/winui/install.ps1 - configuration: Workloads/winui/configuration.winget + install: src/Workloads/winui/install.ps1 + configuration: src/Workloads/winui/configuration.winget build: dotnet build src/tests/winui/hello.csproj -c Release -v q --nologo -o src/tests/winui/bin run: src\tests\winui\bin\hello.exe expected: src/tests/winui/expected.txt @@ -150,8 +150,8 @@ flows: onboardingUrl: https://learn.microsoft.com/dotnet/core/install/windows os: [windows] windows: - install: Workloads/dotnet/install.ps1 - configuration: Workloads/dotnet/configuration.winget + install: src/Workloads/dotnet/install.ps1 + configuration: src/Workloads/dotnet/configuration.winget build: dotnet build src/tests/dotnet/hello.csproj -c Release -v q --nologo -o src/tests/dotnet/bin run: src\tests\dotnet\bin\hello.exe expected: src/tests/dotnet/expected.txt @@ -166,8 +166,8 @@ flows: onboardingUrl: https://go.dev/doc/install os: [windows] windows: - install: Workloads/go/install.ps1 - configuration: Workloads/go/configuration.winget + install: src/Workloads/go/install.ps1 + configuration: src/Workloads/go/configuration.winget build: "" run: go run src/tests/go/hello.go expected: src/tests/go/expected.txt @@ -182,8 +182,8 @@ flows: onboardingUrl: https://learn.microsoft.com/java/openjdk/install os: [windows] windows: - install: Workloads/java/install.ps1 - configuration: Workloads/java/configuration.winget + install: src/Workloads/java/install.ps1 + configuration: src/Workloads/java/configuration.winget build: "" run: java src/tests/java/Hello.java expected: src/tests/java/expected.txt @@ -198,8 +198,8 @@ flows: onboardingUrl: https://www.rust-lang.org/tools/install os: [windows] windows: - install: Workloads/rust/install.ps1 - configuration: Workloads/rust/configuration.winget + install: src/Workloads/rust/install.ps1 + configuration: src/Workloads/rust/configuration.winget build: cargo build --release --manifest-path src/tests/rust/Cargo.toml --quiet run: src\tests\rust\target\release\hello.exe expected: src/tests/rust/expected.txt @@ -214,8 +214,8 @@ flows: onboardingUrl: https://docs.python.org/3/using/windows.html os: [windows] windows: - install: Workloads/python/install.ps1 - configuration: Workloads/python/configuration.winget + install: src/Workloads/python/install.ps1 + configuration: src/Workloads/python/configuration.winget build: "" run: python src/tests/python/hello.py expected: src/tests/python/expected.txt @@ -234,32 +234,32 @@ flows: manual_test: true os: [windows] windows: - install: wsl-comfort/install.ps1 + install: src/wsl-comfort/install.ps1 build: "" run: wsl -- bash src/tests/comfort-shell/hello.sh expected: src/tests/comfort-shell/expected.txt version: "wsl --status" - - id: calm-os - name: Calm OS + - id: windows-dev-config + name: Windows Dev Config description: Distraction-free dev workstation — apps + OS settings + WSL, all in one DSC category: user-experience - tags: [user-experience, calm-os, distraction-free, taskbar, wsl, ubuntu] + tags: [user-experience, windows-dev-config, distraction-free, taskbar, wsl, ubuntu] icon: 🧘 onboardingUrl: https://dev.windows.com # Heavy machine-state changes (Sudo, Recall off, Click To Do off, WSL + # Ubuntu install with a forced reboot, etc.) — keep out of the automated - # matrix. The probe under src/tests/calm-os/probe.ps1 is for a human running + # matrix. The probe under src/tests/windows-dev-config/probe.ps1 is for a human running # the flow locally; it asserts that `git` resolves on PATH after the # install (the apps module's first dep) as a fast smoke signal. manual_test: true os: [windows] windows: - install: windows-dev-config/install.ps1 - configuration: windows-dev-config/dev-config.winget + install: src/windows-dev-config/install.ps1 + configuration: src/windows-dev-config/dev-config.winget build: "" - run: pwsh -NoProfile -File src/tests/calm-os/probe.ps1 - expected: src/tests/calm-os/expected.txt + run: pwsh -NoProfile -File src/tests/windows-dev-config/probe.ps1 + expected: src/tests/windows-dev-config/expected.txt version: "git --version" # Curated bundles of flows. Surfaced by the Command Palette extension; not diff --git a/src/tests/calm-os/expected.txt b/src/tests/windows-dev-config/expected.txt similarity index 100% rename from src/tests/calm-os/expected.txt rename to src/tests/windows-dev-config/expected.txt diff --git a/src/tests/calm-os/probe.ps1 b/src/tests/windows-dev-config/probe.ps1 similarity index 94% rename from src/tests/calm-os/probe.ps1 rename to src/tests/windows-dev-config/probe.ps1 index a73dc46..34f433d 100644 --- a/src/tests/calm-os/probe.ps1 +++ b/src/tests/windows-dev-config/probe.ps1 @@ -1,4 +1,4 @@ -# Smoke-test probe for the calm-os user-experience flow. +# Smoke-test probe for the windows-dev-config user-experience flow. # # After the master config has been applied, the apps module installs # git via winget. The simplest signal a human can use to confirm the diff --git a/src/tests/wsl-comfort-shell/expected.txt b/src/tests/wsl-comfort-shell/expected.txt deleted file mode 100644 index af5626b..0000000 --- a/src/tests/wsl-comfort-shell/expected.txt +++ /dev/null @@ -1 +0,0 @@ -Hello, world! diff --git a/src/tests/wsl-comfort-shell/hello.sh b/src/tests/wsl-comfort-shell/hello.sh deleted file mode 100644 index aa02f77..0000000 --- a/src/tests/wsl-comfort-shell/hello.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env zsh -# Minimal hello-world for the wsl-comfort-shell flow. -# -# Invoked via `wsl -d -- zsh -lc 'bash tests/wsl-comfort-shell/hello.sh'`. -# Running this under zsh -lc proves that the shell this flow configures -# (zsh with the wsl-comfort managed block in ~/.zprofile) at least -# dot-sources its login files without errors. -# -# Note: this flow is manual_test: true — CI does not execute this. -echo "Hello, world!" diff --git a/src/windows-dev-config/install.ps1 b/src/windows-dev-config/install.ps1 index 1194635..c2facff 100644 --- a/src/windows-dev-config/install.ps1 +++ b/src/windows-dev-config/install.ps1 @@ -1,16 +1,16 @@ <# .SYNOPSIS - Apply the Calm OS user-experience configuration on Windows. + Apply the Windows Dev Config user-experience configuration on Windows. .DESCRIPTION Thin CI/dev shim around `dev-config.winget`, a winget DSC configuration - that sets up the full Calm OS developer workstation (apps, distraction- - free desktop, taskbar polish, Recall off, dark theme, WSL + Ubuntu). + that sets up the full Windows Dev Config developer workstation (apps, + distraction-free desktop, taskbar polish, Recall off, dark theme, WSL + Ubuntu). The shim only: * applies the DSC config with retry, * rehydrates PATH in the current session, - * emits `INSTALL_OK: calm-os` for the test harness. + * emits `INSTALL_OK: windows-dev-config` for the test harness. RequireCommands lists `git` because the master config installs it unconditionally; asserting it on PATH catches a clean-install failure @@ -24,6 +24,6 @@ $ErrorActionPreference = 'Stop' Set-StrictMode -Version Latest & (Join-Path $PSScriptRoot '..\Workloads\_common\apply-configuration.ps1') ` - -Id 'calm-os' ` + -Id 'windows-dev-config' ` -ConfigFile (Join-Path $PSScriptRoot 'dev-config.winget') ` -RequireCommands @('git') From f506d6bbe4268240a97dc51684b03967da448cf3 Mon Sep 17 00:00:00 2001 From: Sharla Soennichsen <45182130+shakersMSFT@users.noreply.github.com> Date: Thu, 28 May 2026 10:27:23 -0700 Subject: [PATCH 2/5] Apply suggestions from code review Co-authored-by: Clint Rutkas --- src/docs/development.md | 4 ++-- src/future/cmdpal/README.md | 2 +- src/manifest.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/docs/development.md b/src/docs/development.md index 4914739..1b92271 100644 --- a/src/docs/development.md +++ b/src/docs/development.md @@ -1,4 +1,4 @@ -# WindowsDeveloperConfig — Developer Guide +# Windows Developer Config — Developer Guide > 👋 **Just want to run something?** See the > [top-level README](../../README.md). This file is the contributor / @@ -46,7 +46,7 @@ extension. | Python | ✅ automated | `Python.Python.3.13`, `astral-sh.uv` | | WinForms | 🙋 manual | `Microsoft.DotNet.SDK.10` + the .NET desktop workload (multi-GB; manual to spare CI minutes) | | WinUI 3 | 🙋 manual | `Microsoft.DotNet.SDK.10`, `Microsoft.VisualStudio.Community`, `Microsoft.WinAppCLI` + WinUI/Universal/ManagedDesktop VS workloads | -| Windows Dev Config | 🙋 manual | A full distraction-free workstation: apps + ~24 registry tweaks + WSL + Ubuntu (see [`windows-dev-config/README.md`](../windows-dev-config/README.md)) | +| Windows Dev Config | 🙋 manual | A full distraction-free workstation: apps + registry tweaks + WSL + Ubuntu (see [`windows-dev-config/README.md`](../windows-dev-config/README.md)) | | Comfort Shell | 🙋 manual | WSL distro + zsh/bash + starship + modern CLI bundle + Cascadia Code Nerd Font + themed Windows Terminal profile (see [`wsl-comfort/readme.md`](../wsl-comfort/readme.md)) | See [`manifest.yml`](../manifest.yml) for the canonical declarative diff --git a/src/future/cmdpal/README.md b/src/future/cmdpal/README.md index 124e4ec..3f56f5c 100644 --- a/src/future/cmdpal/README.md +++ b/src/future/cmdpal/README.md @@ -37,7 +37,7 @@ The list view groups by `category`, with this priority order: | 1 | `languages` | Language toolchains (typescript, python, dotnet, ...).| | 2 | `desktop` | Desktop frameworks on top of a language (winforms, winui). | | 3 | (other / default) | Any unrecognized category sorts here. | -| 4 | `user-experience` | OS-feel flows (windows-dev-config, comfort-shell). | +| 4 | `user-experience` | OS-feel flows (windows-dev-config, wsl-comfort). | | 4 | `shell` | Legacy alias for `user-experience`. New flows should pick `user-experience`. | Within a rank, flows sort alphabetically by category then by name. diff --git a/src/manifest.yml b/src/manifest.yml index e372e25..d46f815 100644 --- a/src/manifest.yml +++ b/src/manifest.yml @@ -237,7 +237,7 @@ flows: install: src/wsl-comfort/install.ps1 build: "" run: wsl -- bash src/tests/comfort-shell/hello.sh - expected: src/tests/comfort-shell/expected.txt + expected: src/tests/wsl-comfort/expected.txt version: "wsl --status" - id: windows-dev-config From 201c1f57b8fa9c5879b09a0ace2d8d822b356272 Mon Sep 17 00:00:00 2001 From: Sharla Soennichsen Date: Thu, 28 May 2026 10:31:44 -0700 Subject: [PATCH 3/5] updated to wsl-comfort in test folder --- src/tests/{comfort-shell => wsl-comfort}/expected.txt | 0 src/tests/{comfort-shell => wsl-comfort}/hello.sh | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/tests/{comfort-shell => wsl-comfort}/expected.txt (100%) rename src/tests/{comfort-shell => wsl-comfort}/hello.sh (100%) diff --git a/src/tests/comfort-shell/expected.txt b/src/tests/wsl-comfort/expected.txt similarity index 100% rename from src/tests/comfort-shell/expected.txt rename to src/tests/wsl-comfort/expected.txt diff --git a/src/tests/comfort-shell/hello.sh b/src/tests/wsl-comfort/hello.sh similarity index 100% rename from src/tests/comfort-shell/hello.sh rename to src/tests/wsl-comfort/hello.sh From c8e02171efebbd022fbef03ca0dec3c67679c2c4 Mon Sep 17 00:00:00 2001 From: Sharla Soennichsen Date: Thu, 28 May 2026 11:55:38 -0700 Subject: [PATCH 4/5] updated to wsl-comfort in manifest.yml --- src/manifest.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/manifest.yml b/src/manifest.yml index d46f815..862fdf2 100644 --- a/src/manifest.yml +++ b/src/manifest.yml @@ -221,8 +221,8 @@ flows: expected: src/tests/python/expected.txt version: "python --version; uv --version" - - id: comfort-shell - name: Comfort Shell + - id: wsl-comfort + name: WSL Comfort description: Cozy WSL shell setup — zsh/bash, starship, modern CLI tools, and shims category: user-experience tags: [user-experience, wsl, zsh, bash, shell, starship, homebrew, terminal, nerd-font] @@ -236,7 +236,7 @@ flows: windows: install: src/wsl-comfort/install.ps1 build: "" - run: wsl -- bash src/tests/comfort-shell/hello.sh + run: wsl -- bash src/tests/wsl-comfort/hello.sh expected: src/tests/wsl-comfort/expected.txt version: "wsl --status" From b20e09997b8db7bb2eb900bed874648e20b22e62 Mon Sep 17 00:00:00 2001 From: Sharla Soennichsen Date: Thu, 28 May 2026 16:49:37 -0700 Subject: [PATCH 5/5] restore files then replace strings --- src/docs/development.md | 147 +++++++++++++++++++--------------------- src/manifest.yml | 36 +++++----- 2 files changed, 88 insertions(+), 95 deletions(-) diff --git a/src/docs/development.md b/src/docs/development.md index 1b92271..868d3de 100644 --- a/src/docs/development.md +++ b/src/docs/development.md @@ -8,13 +8,13 @@ Opinionated, CI-validated configurations for bootstrapping developer toolchains and Windows-desktop personalities using `winget` / `winget configure`. -On Windows, the **core artifact of each flow is a [winget DSC configuration +On Windows the **core artifact of each flow is a [winget DSC configuration file](https://learn.microsoft.com/windows/package-manager/configuration/)** (`configuration.winget` for language toolchains, `dev-config.winget` for the -clean development configuration) — a declarative, idempotent description of the machine state +Windows Dev Config flow) — a declarative, idempotent description of the machine state required for that flow. Where winget alone is not enough (e.g. `npm install --global typescript`, registry tweaks, or a `RunOnce` reboot dance) the -configuration calls a DSC `RunCommandOnSet` / `PowerShellScript` / `Registry` +configuration calls a DSC `Script` / `RunCommandOnSet` / `Registry` resource, so everything the flow needs lives in one YAML file. A small `install.ps1` shim next to it applies the config with `winget configure` and handles session-level glue (PATH refresh, CI sentinel). @@ -27,7 +27,7 @@ configuration actually produced a working toolchain. ## Supported flows -Each flow's `configuration.winget` (or `dev-config.winget`) +Each flow's `configuration.winget` (or `dev-config.winget` for Windows Dev Config) is the source of truth for what gets installed; the table below summarizes it for quick scanning. Flows marked **manual** are excluded from the automated CI matrix (they need an interactive desktop session @@ -46,13 +46,13 @@ extension. | Python | ✅ automated | `Python.Python.3.13`, `astral-sh.uv` | | WinForms | 🙋 manual | `Microsoft.DotNet.SDK.10` + the .NET desktop workload (multi-GB; manual to spare CI minutes) | | WinUI 3 | 🙋 manual | `Microsoft.DotNet.SDK.10`, `Microsoft.VisualStudio.Community`, `Microsoft.WinAppCLI` + WinUI/Universal/ManagedDesktop VS workloads | -| Windows Dev Config | 🙋 manual | A full distraction-free workstation: apps + registry tweaks + WSL + Ubuntu (see [`windows-dev-config/README.md`](../windows-dev-config/README.md)) | -| Comfort Shell | 🙋 manual | WSL distro + zsh/bash + starship + modern CLI bundle + Cascadia Code Nerd Font + themed Windows Terminal profile (see [`wsl-comfort/readme.md`](../wsl-comfort/readme.md)) | +| Windows Dev Config| 🙋 manual | A full distraction-free workstation: apps + ~24 registry tweaks + WSL + Ubuntu (see [`windows-dev-config/README.md`](../windows-dev-config/README.md)) | +| WSL Comfort | 🙋 manual | WSL distro + zsh/bash + starship + modern CLI bundle + Cascadia Code Nerd Font + themed Windows Terminal profile (see [`wsl-comfort/readme.md`](../wsl-comfort/readme.md)) | See [`manifest.yml`](../manifest.yml) for the canonical declarative list (paths, build/run commands, onboarding URLs). -## Command Palette extension (coming soon) +## Command Palette extension A [PowerToys Command Palette](https://learn.microsoft.com/windows/powertoys/command-palette/overview) extension lives under [`future/cmdpal/`](../future/cmdpal/). It reads the same @@ -66,48 +66,41 @@ for build + configuration details. ## Repository layout -All source lives under `src/`. The top-level `Workloads/`, -`windows-dev-config/`, and `wsl-comfort/` directories are signed release -copies — see [Signed vs source](#repo-layout-signed-vs-source) below. - ``` -src/ - Workloads/ - _common/ # shared PowerShell shim helpers (retry, refresh PATH, preflight, assert-winget-configure, apply-configuration) - typescript/ # configuration.winget (core) + install.ps1 (thin shim) - php/ # configuration.winget (core) + install.ps1 (thin shim) - python/ # configuration.winget (core) + install.ps1 (thin shim) - dotnet/ # configuration.winget (core) + install.ps1 (thin shim) - go/ # configuration.winget (core) + install.ps1 (thin shim) - java/ # configuration.winget (core) + install.ps1 (thin shim) - rust/ # configuration.winget (core) + install.ps1 (thin shim) - winforms/ # configuration.winget (core) + install.ps1 (thin shim) - winui/ # configuration.winget (core) + install.ps1 (thin shim) - windows-dev-config/ # Windows Dev Config — dev-config.winget (single-file DSC) + install.ps1 + README.md - wsl-comfort/ # Comfort Shell — install.ps1 (Windows side) + comfort-shell-bootstrap.sh (Linux side, self-contained) + readme.md - tests/ - _harness/ # build-run-diff harness used by CI: - # run-flow.ps1 - all flows (build + run + diff stdout) - # run-server.ps1 - helper for future server scenarios - # (kept idle; no flow currently uses it) - typescript/ # hello.ts + expected.txt - php/ # hello.php + expected.txt - python/ # hello.py + expected.txt - dotnet/ # hello.csproj + Program.cs + expected.txt - go/ # hello.go + expected.txt - java/ # Hello.java + expected.txt - rust/ # Cargo.toml + src/main.rs + expected.txt - winforms/ # hello.csproj + Program.cs + expected.txt - winui/ # hello.csproj + Program.cs + expected.txt - windows-dev-config/ # probe.ps1 + expected.txt (manual-only flow) - comfort-shell/ # hello.sh + expected.txt (manual-only flow) - manifest.yml # declarative list of flows consumed by CI **and** by the extension - future/ - cmdpal/ # PowerToys Command Palette extension (reads manifest.yml) - docs/ - development.md # this file +Workloads/ + _common/ # shared PowerShell shim helpers (retry, refresh PATH, preflight, assert-winget-configure, apply-configuration) + typescript/ # configuration.winget (core) + install.ps1 (thin shim) + php/ # configuration.winget (core) + install.ps1 (thin shim) + python/ # configuration.winget (core) + install.ps1 (thin shim) + dotnet/ # configuration.winget (core) + install.ps1 (thin shim) + go/ # configuration.winget (core) + install.ps1 (thin shim) + java/ # configuration.winget (core) + install.ps1 (thin shim) + rust/ # configuration.winget (core) + install.ps1 (thin shim) + winforms/ # configuration.winget (core) + install.ps1 (thin shim) + winui/ # configuration.winget (core) + install.ps1 (thin shim) +windows-dev-config/ # Windows Dev Config — dev-config.winget (single-file DSC) + install.ps1 + README.md +wsl-comfort/ # WSL Comfort — install.ps1 (Windows side) + comfort-shell-bootstrap.sh (Linux side, self-contained) + readme.md +tests/ + _harness/ # build-run-diff harness used by CI: + # run-flow.ps1 - all flows (build + run + diff stdout) + # run-server.ps1 - helper for future server scenarios + # (kept idle; no flow currently uses it) + typescript/ # hello.ts + expected.txt + php/ # hello.php + expected.txt + python/ # hello.py + expected.txt + dotnet/ # hello.csproj + Program.cs + expected.txt + go/ # hello.go + expected.txt + java/ # Hello.java + expected.txt + rust/ # Cargo.toml + src/main.rs + expected.txt + winforms/ # hello.csproj + Program.cs + expected.txt + winui/ # hello.csproj + Program.cs + expected.txt + windows-dev-config/# probe.ps1 + expected.txt (manual-only flow) + wsl-shell/ # hello.sh + expected.txt (manual-only flow) +manifest.yml # declarative list of flows consumed by CI **and** by the extension +future/ + cmdpal/ # PowerToys Command Palette extension (reads manifest.yml) .github/workflows/ - ci.yml # discover -> per-OS matrix -> summary + ci.yml # discover -> per-OS matrix -> summary ``` ## Repo layout: signed vs source @@ -183,11 +176,11 @@ winget configure --file ./Workloads/typescript/configuration.winget ` session and prints a CI-friendly sentinel: ```powershell -./src/Workloads/typescript/install.ps1 -./src/tests/_harness/run-flow.ps1 -Id typescript ` - -Build 'tsc src/tests/typescript/hello.ts' ` - -Run 'node src/tests/typescript/hello.js' ` - -Expected src/tests/typescript/expected.txt +./Workloads/typescript/install.ps1 +./tests/_harness/run-flow.ps1 -Id typescript ` + -Build 'tsc tests/typescript/hello.ts' ` + -Run 'node tests/typescript/hello.js' ` + -Expected tests/typescript/expected.txt ``` ## Testing and verifying locally @@ -208,11 +201,11 @@ These don't touch your machine state and are a good pre-commit pass: ```bash # DSC YAML parses and has the expected shape. -python3 -c "import yaml; yaml.safe_load(open('src/Workloads/typescript/configuration.winget'))" -python3 -c "import yaml; yaml.safe_load(open('src/Workloads/php/configuration.winget'))" +python3 -c "import yaml; yaml.safe_load(open('Workloads/typescript/configuration.winget'))" +python3 -c "import yaml; yaml.safe_load(open('Workloads/php/configuration.winget'))" # manifest.yml parses (this is what CI's `discover` job consumes). -python3 -c "import yaml; print(yaml.safe_load(open('src/manifest.yml')))" +python3 -c "import yaml; print(yaml.safe_load(open('manifest.yml')))" ``` ```powershell @@ -229,7 +222,7 @@ If you have [PSScriptAnalyzer](https://github.com/PowerShell/PSScriptAnalyzer) installed, also run: ```powershell -Invoke-ScriptAnalyzer -Recurse -Path ./src/Workloads, ./src/tests/_harness +Invoke-ScriptAnalyzer -Recurse -Path ./Workloads, ./tests/_harness ``` ### 2. Validate the DSC config without applying it (Windows) @@ -240,7 +233,7 @@ desired state — useful for "will this config do what I think?" without actually installing anything: ```powershell -winget configure test --file ./src/Workloads/typescript/configuration.winget ` +winget configure test --file ./Workloads/typescript/configuration.winget ` --accept-configuration-agreements ` --disable-interactivity ``` @@ -255,37 +248,37 @@ This is exactly what CI does and is the definitive local test: ```powershell # a) Apply the DSC config via the shim (this is what CI invokes). -./src/Workloads/typescript/install.ps1 +./Workloads/typescript/install.ps1 # Expected tail of output: "INSTALL_OK: typescript" # b) Build + run the hello-world and diff its stdout against expected.txt. -./src/tests/_harness/run-flow.ps1 -Id typescript ` - -Build 'tsc src/tests/typescript/hello.ts' ` - -Run 'node src/tests/typescript/hello.js' ` - -Expected src/tests/typescript/expected.txt +./tests/_harness/run-flow.ps1 -Id typescript ` + -Build 'tsc tests/typescript/hello.ts' ` + -Run 'node tests/typescript/hello.js' ` + -Expected tests/typescript/expected.txt # Expected tail of output: "FLOW_OK: typescript" # c) Re-run the install to prove idempotence — it should succeed again and # report no packages changed. -./src/Workloads/typescript/install.ps1 +./Workloads/typescript/install.ps1 ``` Swap `typescript` for `php` (and the matching build/run args from -[`src/manifest.yml`](../manifest.yml)) to verify the PHP flow the same way. +[`manifest.yml`](../manifest.yml)) to verify the PHP flow the same way. ### 4. Drive every flow from the manifest (Windows) -If you're changing something shared (`src/Workloads/_common/*.ps1`, the harness, +If you're changing something shared (`Workloads/_common/*.ps1`, the harness, or the manifest schema) and want to exercise every flow the way CI will: ```powershell -$flows = (ConvertFrom-Yaml (Get-Content -Raw ./src/manifest.yml)).flows | +$flows = (ConvertFrom-Yaml (Get-Content -Raw ./manifest.yml)).flows | Where-Object { $_.os -contains 'windows' -and -not $_.manual_test } foreach ($f in $flows) { Write-Host "=== $($f.id) ===" & $f.windows.install - ./src/tests/_harness/run-flow.ps1 ` + ./tests/_harness/run-flow.ps1 ` -Id $f.id ` -Build ($f.windows.build ?? '') ` -Run $f.windows.run ` @@ -295,18 +288,18 @@ foreach ($f in $flows) { `ConvertFrom-Yaml` comes from the `powershell-yaml` module (`Install-Module powershell-yaml -Scope CurrentUser`). If you don't want that -dependency, just copy the build/run strings out of `src/manifest.yml` by hand. +dependency, just copy the build/run strings out of `manifest.yml` by hand. ### 5. Validating CI itself -To sanity-check a change to `.github/workflows/ci.yml` or `src/manifest.yml` +To sanity-check a change to `.github/workflows/ci.yml` or `manifest.yml` without a full CI round-trip, run `discover`'s Python block locally — it will reject malformed flows with the same error CI would: ```bash python3 - <<'PY' import yaml, json -doc = yaml.safe_load(open("src/manifest.yml")) +doc = yaml.safe_load(open("manifest.yml")) for flow in doc.get("flows", []): for os_name in flow.get("os", []): spec = flow.get(os_name) or {} @@ -320,18 +313,18 @@ PY Adding a language is a **data change**, not a workflow change: -1. Add a `configuration.winget` at `src/Workloads//` describing the +1. Add a `configuration.winget` at `Workloads//` describing the winget packages and any PowerShell (via `Microsoft.DSC.Transitional/RunCommandOnSet` - or `Microsoft.DSC.Transitional/PowerShellScript` resources) needed to reach - the desired state. This file is the core artifact — it should be readable - on its own and applied directly with `winget configure`. + or `PSDscResources/Script` resources) needed to reach the desired state. + This file is the core artifact — it should be readable on its own and + applyable with `winget configure`. 2. Add a thin `install.ps1` shim next to it that delegates to - `src/Workloads/_common/apply-configuration.ps1` with the flow id, config + `Workloads/_common/apply-configuration.ps1` with the flow id, config path, and list of commands that must be on PATH afterwards. The shim ends with `INSTALL_OK: `, which CI asserts on. -3. Add a hello world under `src/tests//` together with an `expected.txt` +3. Add a hello world under `tests//` together with an `expected.txt` containing its exact stdout. -4. Append an entry to `src/manifest.yml` describing the build command, run +4. Append an entry to `manifest.yml` describing the build command, run command, and expected-output path for each supported OS. That's it — `discover` in CI picks up the new flow automatically. diff --git a/src/manifest.yml b/src/manifest.yml index 862fdf2..2416cb2 100644 --- a/src/manifest.yml +++ b/src/manifest.yml @@ -114,9 +114,9 @@ flows: manual_test: true os: [windows] windows: - install: src/Workloads/winforms/install.ps1 - configuration: src/Workloads/winforms/configuration.winget - build: dotnet build src/tests/winforms/hello.csproj -c Release -v q --nologo -o src/tests/winforms/bin + install: Workloads/winforms/install.ps1 + configuration: Workloads/winforms/configuration.winget + build: dotnet build src/tests/winforms/hello.csproj -c Release -v q --nologo -o tests/winforms/bin run: src\tests\winforms\bin\hello.exe expected: src/tests/winforms/expected.txt version: "dotnet --version" @@ -134,8 +134,8 @@ flows: manual_test: true os: [windows] windows: - install: src/Workloads/winui/install.ps1 - configuration: src/Workloads/winui/configuration.winget + install: Workloads/winui/install.ps1 + configuration: Workloads/winui/configuration.winget build: dotnet build src/tests/winui/hello.csproj -c Release -v q --nologo -o src/tests/winui/bin run: src\tests\winui\bin\hello.exe expected: src/tests/winui/expected.txt @@ -150,8 +150,8 @@ flows: onboardingUrl: https://learn.microsoft.com/dotnet/core/install/windows os: [windows] windows: - install: src/Workloads/dotnet/install.ps1 - configuration: src/Workloads/dotnet/configuration.winget + install: Workloads/dotnet/install.ps1 + configuration: Workloads/dotnet/configuration.winget build: dotnet build src/tests/dotnet/hello.csproj -c Release -v q --nologo -o src/tests/dotnet/bin run: src\tests\dotnet\bin\hello.exe expected: src/tests/dotnet/expected.txt @@ -166,8 +166,8 @@ flows: onboardingUrl: https://go.dev/doc/install os: [windows] windows: - install: src/Workloads/go/install.ps1 - configuration: src/Workloads/go/configuration.winget + install: Workloads/go/install.ps1 + configuration: Workloads/go/configuration.winget build: "" run: go run src/tests/go/hello.go expected: src/tests/go/expected.txt @@ -182,8 +182,8 @@ flows: onboardingUrl: https://learn.microsoft.com/java/openjdk/install os: [windows] windows: - install: src/Workloads/java/install.ps1 - configuration: src/Workloads/java/configuration.winget + install: Workloads/java/install.ps1 + configuration: Workloads/java/configuration.winget build: "" run: java src/tests/java/Hello.java expected: src/tests/java/expected.txt @@ -198,8 +198,8 @@ flows: onboardingUrl: https://www.rust-lang.org/tools/install os: [windows] windows: - install: src/Workloads/rust/install.ps1 - configuration: src/Workloads/rust/configuration.winget + install: Workloads/rust/install.ps1 + configuration: Workloads/rust/configuration.winget build: cargo build --release --manifest-path src/tests/rust/Cargo.toml --quiet run: src\tests\rust\target\release\hello.exe expected: src/tests/rust/expected.txt @@ -214,8 +214,8 @@ flows: onboardingUrl: https://docs.python.org/3/using/windows.html os: [windows] windows: - install: src/Workloads/python/install.ps1 - configuration: src/Workloads/python/configuration.winget + install: Workloads/python/install.ps1 + configuration: Workloads/python/configuration.winget build: "" run: python src/tests/python/hello.py expected: src/tests/python/expected.txt @@ -234,7 +234,7 @@ flows: manual_test: true os: [windows] windows: - install: src/wsl-comfort/install.ps1 + install: wsl-comfort/install.ps1 build: "" run: wsl -- bash src/tests/wsl-comfort/hello.sh expected: src/tests/wsl-comfort/expected.txt @@ -255,8 +255,8 @@ flows: manual_test: true os: [windows] windows: - install: src/windows-dev-config/install.ps1 - configuration: src/windows-dev-config/dev-config.winget + install: windows-dev-config/install.ps1 + configuration: windows-dev-config/dev-config.winget build: "" run: pwsh -NoProfile -File src/tests/windows-dev-config/probe.ps1 expected: src/tests/windows-dev-config/expected.txt