Skip to content

Commit 485b6e2

Browse files
s-barnclaude
andauthored
feat: add MSIX installer and migrate to .NET 10 (#1)
* Add MSIX installer design spec Documents the wapproj-based MSIX packaging approach for Microsoft Store distribution, including package identity, manifest structure, CI pipeline changes, and local build script updates. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Add MSIX installer implementation plan Step-by-step plan for wapproj setup, manifest, CI pipeline changes, local build script, and documentation updates. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: ignore .worktrees/ directory * chore: migrate to .NET 10 - Update all project TFMs from net8.0-windows to net10.0-windows - Update CI workflows to setup-dotnet 10.0.x - Remove redundant System.Text.Json package reference (inbox in .NET 10) - Fix PlaceholderText (WinUI-only) → ToolTip on ExclusionTextBox - Fix WindowMover constructor call (drop spurious settingsService arg) - Add placeholder windowseat.ico (was missing from repo) - Update docs to reference .NET 10 SDK Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(packaging): add placeholder MSIX image assets * feat(packaging): add MSIX package manifest * feat(packaging): add Windows Application Packaging Project * feat(packaging): add WindowSeat.Package to solution * feat(ci): build MSIX via wapproj and upload as Store submission artifact * feat(build): add local MSIX packaging to build.ps1 -Package switch * docs: update installation and uninstall instructions for Store/ZIP model * fix(ci): target app project directly to avoid dotnet CLI failing on wapproj Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(ci): split dotnet restore into per-project calls (.NET 10 limitation) * fix(ci): build test project before running tests The build step only compiled the app project, leaving the test DLL absent. --no-build on dotnet test then failed to find it. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: GrumpyGent <2617168+TheGrumpyGent@users.noreply.github.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent f4edaec commit 485b6e2

24 files changed

Lines changed: 991 additions & 39 deletions

.github/workflows/build.yml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,20 @@ jobs:
1414
- name: Checkout
1515
uses: actions/checkout@v4
1616

17-
- name: Setup .NET 8
17+
- name: Setup .NET 10
1818
uses: actions/setup-dotnet@v4
1919
with:
20-
dotnet-version: '8.0.x'
20+
dotnet-version: '10.0.x'
2121

2222
- name: Restore dependencies
23-
run: dotnet restore WindowSeat.sln
23+
run: |
24+
dotnet restore src/WindowSeat.App/WindowSeat.App.csproj
25+
dotnet restore src/WindowSeat.Tests/WindowSeat.Tests.csproj
2426
2527
- name: Build (Release)
26-
run: dotnet build WindowSeat.sln --configuration Release --no-restore
28+
run: |
29+
dotnet build src/WindowSeat.App/WindowSeat.App.csproj --configuration Release --no-restore
30+
dotnet build src/WindowSeat.Tests/WindowSeat.Tests.csproj --configuration Release --no-restore
2731
2832
- name: Run tests
2933
run: dotnet test src/WindowSeat.Tests/WindowSeat.Tests.csproj --configuration Release --no-build --verbosity normal --logger trx --results-directory TestResults

.github/workflows/release.yml

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,13 @@ jobs:
1313
- name: Checkout
1414
uses: actions/checkout@v4
1515

16-
- name: Setup .NET 8
16+
- name: Setup .NET 10
1717
uses: actions/setup-dotnet@v4
1818
with:
19-
dotnet-version: '8.0.x'
19+
dotnet-version: '10.0.x'
20+
21+
- name: Setup MSBuild
22+
uses: microsoft/setup-msbuild@v2
2023

2124
- name: Extract version from tag
2225
id: version
@@ -27,14 +30,14 @@ jobs:
2730
echo "VERSION=$version" >> $env:GITHUB_OUTPUT
2831
2932
- name: Restore dependencies
30-
run: dotnet restore WindowSeat.sln
33+
run: |
34+
dotnet restore src/WindowSeat.App/WindowSeat.App.csproj
35+
dotnet restore src/WindowSeat.Tests/WindowSeat.Tests.csproj
3136
3237
- name: Build (Release)
33-
run: >
34-
dotnet build WindowSeat.sln
35-
--configuration Release
36-
--no-restore
37-
/p:Version=${{ steps.version.outputs.VERSION }}
38+
run: |
39+
dotnet build src/WindowSeat.App/WindowSeat.App.csproj --configuration Release --no-restore /p:Version=${{ steps.version.outputs.VERSION }}
40+
dotnet build src/WindowSeat.Tests/WindowSeat.Tests.csproj --configuration Release --no-restore
3841
3942
- name: Run tests
4043
run: >
@@ -52,16 +55,40 @@ jobs:
5255
--output publish/
5356
/p:Version=${{ steps.version.outputs.VERSION }}
5457
55-
# ── MSIX packaging ────────────────────────────────────────────────────
56-
# TODO: Wire up Windows Application Packaging Project (wapproj) here
57-
# once packaging/ scaffold is complete. For v1.0, zip the publish output
58-
# as a stopgap so users can still download and run.
59-
60-
- name: Package (stopgap zip)
58+
# ── ZIP (GitHub Releases sideload) ────────────────────────────────────
59+
- name: Package zip
6160
shell: pwsh
6261
run: |
6362
Compress-Archive -Path publish/* -DestinationPath "WindowSeat-${{ steps.version.outputs.VERSION }}-win-x64.zip"
6463
64+
# ── MSIX (Microsoft Store submission) ─────────────────────────────────
65+
- name: Patch manifest version
66+
shell: pwsh
67+
run: |
68+
$v = "${{ steps.version.outputs.VERSION }}.0"
69+
$path = "packaging/WindowSeat.Package/Package.appxmanifest"
70+
(Get-Content $path -Raw) `
71+
-replace '(?<=<Identity[^>]*Version=")[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+', $v |
72+
Set-Content $path
73+
Write-Host "Manifest version set to $v"
74+
75+
- name: Build MSIX package
76+
shell: pwsh
77+
run: |
78+
msbuild packaging/WindowSeat.Package/WindowSeat.Package.wapproj `
79+
/p:Configuration=Release `
80+
/p:Platform=x64 `
81+
/p:AppxPackageSigningEnabled=false `
82+
/p:AppxAutoIncrementPackageRevision=false `
83+
/p:GenerateTestArtifacts=false `
84+
"/p:AppxPackageDir=${{ github.workspace }}\artifacts\msix\\"
85+
86+
- name: Upload MSIX (Store submission artifact)
87+
uses: actions/upload-artifact@v4
88+
with:
89+
name: WindowSeat-${{ steps.version.outputs.VERSION }}-store-package
90+
path: artifacts/msix/*.msix
91+
6592
- name: Create GitHub Release
6693
uses: softprops/action-gh-release@v2
6794
with:

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ coverage/
5656
Thumbs.db
5757
Desktop.ini
5858

59+
# Git worktrees
60+
.worktrees/
61+
5962
# Secrets — never commit these
6063
*.pfx
6164
*.p12

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ For advanced configuration see [docs/power-user-guide.md](docs/power-user-guide.
5959
## Building from Source
6060

6161
**Prerequisites**
62-
- [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)
62+
- [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)
6363
- Visual Studio 2022 (17.8+) with the **Windows application development** workload, or VS Code with the C# Dev Kit extension
6464

6565
**Clone and build**

WindowSeat.sln

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowSeat.Settings", "src\
1010
EndProject
1111
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowSeat.Tests", "src\WindowSeat.Tests\WindowSeat.Tests.csproj", "{A1B2C3D4-0004-0004-0004-000000000004}"
1212
EndProject
13+
Project("{C7167F0D-BC9F-4E6A-9F78-5F2B13F8E92E}") = "WindowSeat.Package", "packaging\WindowSeat.Package\WindowSeat.Package.wapproj", "{D1E2F3A4-0005-0005-0005-000000000005}"
14+
EndProject
1315
Global
1416
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1517
Debug|Any CPU = Debug|Any CPU
@@ -32,5 +34,9 @@ Global
3234
{A1B2C3D4-0004-0004-0004-000000000004}.Debug|Any CPU.Build.0 = Debug|Any CPU
3335
{A1B2C3D4-0004-0004-0004-000000000004}.Release|Any CPU.ActiveCfg = Release|Any CPU
3436
{A1B2C3D4-0004-0004-0004-000000000004}.Release|Any CPU.Build.0 = Release|Any CPU
37+
{D1E2F3A4-0005-0005-0005-000000000005}.Debug|Any CPU.ActiveCfg = Debug|x64
38+
{D1E2F3A4-0005-0005-0005-000000000005}.Debug|Any CPU.Build.0 = Debug|x64
39+
{D1E2F3A4-0005-0005-0005-000000000005}.Release|Any CPU.ActiveCfg = Release|x64
40+
{D1E2F3A4-0005-0005-0005-000000000005}.Release|Any CPU.Build.0 = Release|x64
3541
EndGlobalSection
3642
EndGlobal

docs/WindowSeat-Scope.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
**Last Updated:** 2026-03-30
55
**License:** MIT
66
**Target Platform:** Windows 11 (primary), Windows 10 22H2+ (best effort)
7-
**Stack:** .NET 8 LTS, C#, WPF, PowerShell (build/packaging tooling)
7+
**Stack:** .NET 10, C#, WPF, PowerShell (build/packaging tooling)
88

99
---
1010

docs/contributing.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Thank you for your interest in contributing. This document covers everything you
66

77
## Prerequisites
88

9-
- [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)
9+
- [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)
1010
- Visual Studio 2022 (17.8+) with the **Windows application development** workload
1111
_or_ VS Code with the [C# Dev Kit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) extension
1212
- Git

0 commit comments

Comments
 (0)