fix: ScrollView() factory mounts the modern WinUI ScrollView (#348) (… #464
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Package | |
| # Produces the framework NuGet (.nupkg + .snupkg) and the agent skill kit | |
| # (reactor-skill-kit-<version>.zip with bin/x64 + bin/arm64). | |
| # | |
| # Versions come from MinVer (see "Resolve version" step). Both PR and main | |
| # builds get the same MinVer-computed version; they differ by sha in build | |
| # metadata and by workflow run ID. Tag pushes (`v*`) get the tag's version | |
| # verbatim and additionally create a GitHub Release with the assets attached. | |
| # This is the interim distribution path described in | |
| # docs/specs/022-packaging-and-distribution.md §3 (Phase P0) while the | |
| # internal Microsoft NuGet feed is being plumbed through. | |
| # | |
| # Both x64 and arm64 mur binaries are produced on every run so reviewers can | |
| # install either against a feature branch. | |
| on: | |
| pull_request: | |
| paths-ignore: | |
| - 'docs/guide/**' # auto-generated; see CLAUDE.md memory note | |
| push: | |
| # No paths-ignore on push: tag pushes must always run regardless of what | |
| # changed in the tagged commit, and main pushes are infrequent enough | |
| # that running on doc-only changes isn't a real cost. | |
| branches: [main] | |
| tags: | |
| - 'v*' | |
| workflow_dispatch: | |
| inputs: | |
| version: | |
| description: 'Version to pack (e.g. 0.1.0-preview.1). When dispatched manually, no Release is created.' | |
| required: true | |
| type: string | |
| permissions: | |
| contents: write # required for creating Releases | |
| # ─── Version strategy ─────────────────────────────────────────────────────── | |
| # Versions come from MinVer (commit-height past the latest `v*` tag). Pattern: | |
| # | |
| # - Past tag `v0.1.0-experimental.1` by N commits → `0.1.0-experimental.1.N+<sha7>` | |
| # - Exactly at a tag → that tag's version | |
| # - No tags yet → `0.1.0-experimental.0.<height>+<sha7>` (defaults below) | |
| # | |
| # Bootstrap once: `git tag v0.1.0-experimental.0 && git push --tags`. After | |
| # that, every commit gets a unique, ordered version with zero coordination — | |
| # height strictly increases as commits land. Bump to a new milestone by | |
| # tagging (e.g. `v0.1.0-experimental.1`); MinVer takes it from there. | |
| # | |
| # Tag pushes (`v*`) produce a clean version and create a GitHub Release. | |
| # Pushes to main and PR builds get the same MinVer-computed version (they | |
| # differ by sha → unique workflow artifacts; the .nupkg filename may collide | |
| # across PR pushes from the same merge base, which is acceptable for the | |
| # experimental channel). | |
| jobs: | |
| package: | |
| name: Pack (x64 + arm64) | |
| runs-on: windows-latest | |
| steps: | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| with: | |
| fetch-depth: 0 # MinVer needs full history to find the latest v* tag | |
| - name: Setup .NET | |
| uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5.2.0 | |
| with: | |
| dotnet-version: 10.0.x | |
| - name: Install minver-cli | |
| run: dotnet tool install --global minver-cli --version 5.0.0 | |
| - name: Resolve version | |
| id: version | |
| shell: pwsh | |
| run: | | |
| $eventName = '${{ github.event_name }}' | |
| if ($eventName -eq 'workflow_dispatch') { | |
| $version = '${{ inputs.version }}' | |
| } else { | |
| # MinVer flags: | |
| # -t v tag prefix | |
| # -p experimental.0 default prerelease identifiers — flags pre-P1 builds as experimental | |
| # -m 0.1 minimum major.minor when no tag (so untagged → 0.1.x) | |
| $version = (& minver -t v -p experimental.0 -m 0.1).Trim() | |
| } | |
| if (-not $version) { throw "Could not resolve version" } | |
| "version=$version" >> $env:GITHUB_OUTPUT | |
| $isTag = '${{ github.ref }}'.StartsWith('refs/tags/v') | |
| "is_tag=$($isTag.ToString().ToLower())" >> $env:GITHUB_OUTPUT | |
| Write-Host "Version: $version (event=$eventName, isTag=$isTag)" | |
| - name: Restore | |
| run: dotnet restore Reactor.slnx | |
| - name: Build framework + analyzers | |
| run: dotnet build Reactor.slnx --no-restore --configuration Release | |
| - name: Pack framework NuGet | |
| run: > | |
| dotnet pack src/Reactor/Reactor.csproj | |
| --no-build --configuration Release | |
| -p:Version=${{ steps.version.outputs.version }} | |
| -o artifacts/nupkg | |
| - name: Pack Templates | |
| run: > | |
| dotnet pack tools\Templates\Microsoft.UI.Reactor.Templates.csproj | |
| --no-build --configuration Release | |
| -p:Version=${{ steps.version.outputs.version }} | |
| -p:Platform=AnyCPU | |
| -o artifacts/nupkg | |
| # Framework-dependent: the consumer's machine supplies the .NET 10 | |
| # runtime — saves ~70 MB per RID. install-skill-kit.ps1 checks for it | |
| # and errors out with an install hint if it's missing. See spec 022 §6. | |
| - name: Publish mur (win-x64) | |
| run: > | |
| dotnet publish src/Reactor.Cli/Reactor.Cli.csproj | |
| --configuration Release | |
| --runtime win-x64 | |
| --self-contained false | |
| -p:Version=${{ steps.version.outputs.version }} | |
| -o artifacts/mur/x64 | |
| - name: Publish mur (win-arm64) | |
| run: > | |
| dotnet publish src/Reactor.Cli/Reactor.Cli.csproj | |
| --configuration Release | |
| --runtime win-arm64 | |
| --self-contained false | |
| -p:Version=${{ steps.version.outputs.version }} | |
| -o artifacts/mur/arm64 | |
| - name: Assemble skill kit | |
| shell: pwsh | |
| run: | | |
| $version = '${{ steps.version.outputs.version }}' | |
| $stage = 'artifacts/kit-stage/reactor' | |
| New-Item -ItemType Directory -Force -Path $stage | Out-Null | |
| New-Item -ItemType Directory -Force -Path "$stage/bin/x64" | Out-Null | |
| New-Item -ItemType Directory -Force -Path "$stage/bin/arm64" | Out-Null | |
| Copy-Item SKILL.md $stage | |
| Copy-Item -Recurse skills $stage | |
| Copy-Item artifacts/mur/x64/* "$stage/bin/x64/" -Recurse | |
| Copy-Item artifacts/mur/arm64/* "$stage/bin/arm64/" -Recurse | |
| Copy-Item tools/install-skill-kit.ps1 "$stage/install-skill-kit.ps1" | |
| New-Item -ItemType Directory -Force -Path artifacts/kit | Out-Null | |
| $zip = "artifacts/kit/reactor-skill-kit-$version.zip" | |
| # Archive the `reactor` folder itself (not its contents) so the zip | |
| # contains a single top-level `reactor/` folder. Extracting the zip | |
| # gives the directory layout install-skill-kit.ps1 expects. | |
| Compress-Archive -Path artifacts/kit-stage/reactor -DestinationPath $zip -Force | |
| Write-Host "Kit: $zip" | |
| - name: Upload artifact | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: release-${{ steps.version.outputs.version }} | |
| path: | | |
| artifacts/nupkg/* | |
| artifacts/kit/*.zip | |
| retention-days: 30 | |
| - name: Create GitHub Release | |
| if: steps.version.outputs.is_tag == 'true' | |
| uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0 | |
| with: | |
| name: Reactor ${{ steps.version.outputs.version }} | |
| tag_name: ${{ github.ref_name }} | |
| draft: false | |
| prerelease: ${{ contains(steps.version.outputs.version, '-') }} | |
| generate_release_notes: true | |
| files: | | |
| artifacts/nupkg/*.nupkg | |
| artifacts/nupkg/*.snupkg | |
| artifacts/kit/*.zip | |
| body: | | |
| **Reactor ${{ steps.version.outputs.version }}** | |
| > Interim distribution — see [spec 022](https://github.com/microsoft/microsoft-ui-reactor/blob/main/docs/specs/022-packaging-and-distribution.md) for the rollout plan. | |
| ## Two assets | |
| ### `Microsoft.UI.Reactor.${{ steps.version.outputs.version }}.nupkg` — the framework | |
| Drop into a folder and add a NuGet source pointing at it: | |
| ```xml | |
| <!-- nuget.config --> | |
| <configuration> | |
| <packageSources> | |
| <add key="reactor-local" value="C:\path\to\folder\with\nupkg" /> | |
| </packageSources> | |
| </configuration> | |
| ``` | |
| Then in your `.csproj`: | |
| ```xml | |
| <PackageReference Include="Microsoft.UI.Reactor" Version="${{ steps.version.outputs.version }}" /> | |
| ``` | |
| ### `reactor-skill-kit-${{ steps.version.outputs.version }}.zip` — agent skill bundle + `mur` CLI | |
| Extract, then run: | |
| ```powershell | |
| cd reactor | |
| .\install-skill-kit.ps1 | |
| ``` | |
| Installs to `~/.claude/skills/reactor/` and adds `bin/<arch>` to your user PATH. After a new shell, `mur --version` should resolve. |