Skip to content

Commit 5a97919

Browse files
Merge pull request #38 from RuntimeRascal/feat/win-store
Feat/win store
2 parents 94aa0a6 + 0ccb1f4 commit 5a97919

Some content is hidden

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

57 files changed

+1484
-1704
lines changed

.claude/settings.local.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
"Bash(powershell -Command \"msiexec /i ''C:\\code\\github\\ghost-draw\\installer\\bin\\x64\\Release\\GhostDrawSetup.msi'' /l*v ''install.log'' /qb\")",
88
"WebSearch",
99
"Bash(powershell:*)",
10-
"Bash(powershell.exe -NoProfile -ExecutionPolicy Bypass -File Generate-FileList.ps1)"
10+
"Bash(powershell.exe -NoProfile -ExecutionPolicy Bypass -File Generate-FileList.ps1)",
11+
"Bash(powershell.exe -Command:*)",
12+
"Bash(mkdir:*)",
13+
"Bash(powershell.exe -NoProfile -ExecutionPolicy Bypass -Command \"& ./build-msix.ps1 -Version ''1.0.17'' -Configuration Debug\")"
1114
],
1215
"deny": [],
1316
"ask": []

.github/workflows/README.md

Lines changed: 6 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -20,90 +20,11 @@ This directory contains GitHub Actions workflows for building and releasing Ghos
2020

2121
---
2222

23-
### 2. Release Build (`release.yml`)
24-
25-
**Triggers:**
26-
- Push of version tags (e.g., `v1.0.0`, `v1.2.3`)
27-
28-
**What it does:**
29-
1. Extracts version from the tag
30-
2. Builds the application with the version number
31-
3. Generates WiX component list
32-
4. Builds the installer MSI
33-
5. Creates a GitHub release
34-
6. Uploads the MSI to the release
35-
36-
**Purpose:** Automates the release process and creates downloadable installers.
37-
38-
---
39-
40-
## Creating a Release
41-
42-
To create a new release:
43-
44-
### 1. Update Version (Optional)
45-
46-
If you want to update version strings in the code:
47-
48-
```bash
49-
# Update version in Product.wxs if needed
50-
# Update version in GhostDraw.csproj if needed
51-
```
52-
53-
### 2. Create and Push a Version Tag
54-
55-
```bash
56-
# Create a tag
57-
git tag v1.0.0
58-
59-
# Or create an annotated tag with a message
60-
git tag -a v1.0.0 -m "Release version 1.0.0"
61-
62-
# Push the tag to GitHub
63-
git push origin v1.0.0
64-
```
65-
66-
### 3. Monitor the Workflow
67-
68-
1. Go to **Actions** tab in GitHub
69-
2. Watch the "Build and Release" workflow run
70-
3. Once complete, check the **Releases** page
71-
72-
### 4. Verify the Release
73-
74-
The release will include:
75-
- Release notes
76-
- `GhostDrawSetup-1.0.0.msi` installer file
77-
- Download statistics
78-
79-
---
80-
8123
## Version Numbering
8224

83-
Use [Semantic Versioning](https://semver.org/):
84-
- **MAJOR.MINOR.PATCH** (e.g., `v1.0.0`)
85-
- **MAJOR**: Breaking changes
86-
- **MINOR**: New features (backwards compatible)
87-
- **PATCH**: Bug fixes
88-
89-
Examples:
90-
- `v1.0.0` - Initial release
91-
- `v1.1.0` - New feature added
92-
- `v1.1.1` - Bug fix
93-
- `v2.0.0` - Breaking change
94-
95-
---
96-
97-
## Pre-release Versions
98-
99-
To create a pre-release:
100-
101-
```bash
102-
git tag v1.0.0-beta.1
103-
git push origin v1.0.0-beta.1
104-
```
105-
106-
Then manually mark it as "pre-release" in the GitHub UI.
25+
Use 4-part version numbers (Major.Minor.Build.Revision):
26+
- Example initial store release: `v2.0.0.0`
27+
- Increment the Revision (fourth part) for servicing updates unless a larger change warrants bumping Build/Minor/Major.
10728

10829
---
10930

@@ -119,7 +40,7 @@ Then manually mark it as "pre-release" in the GitHub UI.
11940

12041
### Release Not Created
12142

122-
1. Ensure the tag starts with `v` (e.g., `v1.0.0` not `1.0.0`)
43+
1. Ensure the tag starts with `v` (e.g., `v1.0.0.0` not `1.0.0.0`)
12344
2. Check the tag was pushed to GitHub: `git push origin <tag>`
12445
3. Verify workflow permissions in repository settings
12546

@@ -138,10 +59,10 @@ To build locally without creating a release:
13859
```powershell
13960
# From the repository root
14061
cd installer
141-
.\build.ps1 -Version "1.0.0"
62+
.\build.ps1 -Version "1.0.0.0"
14263
```
14364

14465
The installer will be at:
14566
```
146-
installer\bin\x64\Release\GhostDrawSetup-1.0.0.msi
67+
installer\bin\x64\Release\GhostDrawSetup-1.0.0.0.msi
14768
```

.github/workflows/ci.yml

Lines changed: 82 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ permissions:
1010
contents: write # Required for creating draft releases
1111

1212
env:
13-
VERSION: '' # Will be set from package.json
13+
VERSION: '' # Will be set from package.json (expects 4-part Major.Minor.Build.Revision)
14+
BUILD_MSIX: 'false' # Set to 'true' to enable MSIX package build
1415

1516
jobs:
1617
build:
@@ -103,6 +104,55 @@ jobs:
103104
exit 1
104105
}
105106
107+
# ============================================================
108+
# MSIX Package Build (Optional - Controlled by BUILD_MSIX env var)
109+
# ============================================================
110+
111+
- name: Setup MSBuild
112+
if: env.BUILD_MSIX == 'true'
113+
uses: microsoft/setup-msbuild@v2
114+
115+
- name: Build MSIX package
116+
if: env.BUILD_MSIX == 'true'
117+
shell: pwsh
118+
run: |
119+
Write-Host "Building MSIX package for Microsoft Store..." -ForegroundColor Cyan
120+
121+
# MSBuild is now in PATH thanks to setup-msbuild action
122+
# Build MSIX (unsigned for CI - Store will sign it)
123+
msbuild Package\GhostDraw.Package.wapproj `
124+
/p:Configuration=Release `
125+
/p:Platform=x64 `
126+
/p:AppxBundle=Never `
127+
/p:UapAppxPackageBuildMode=SideloadOnly `
128+
/p:AppxPackageSigningEnabled=false `
129+
/p:GenerateAppInstallerFile=false
130+
131+
if ($LASTEXITCODE -ne 0) {
132+
Write-Error "MSIX build failed"
133+
exit 1
134+
}
135+
136+
- name: Verify MSIX build output
137+
if: env.BUILD_MSIX == 'true'
138+
shell: pwsh
139+
run: |
140+
$msixPath = "Package\AppPackages\GhostDraw.Package_${{ env.VERSION }}_Test\GhostDraw.Package_${{ env.VERSION }}_x64.msix"
141+
142+
if (Test-Path $msixPath) {
143+
$size = (Get-Item $msixPath).Length / 1MB
144+
Write-Host "✓ MSIX package built successfully" -ForegroundColor Green
145+
Write-Host " Path: $msixPath" -ForegroundColor Gray
146+
Write-Host " Size: $([math]::Round($size, 2)) MB" -ForegroundColor Gray
147+
} else {
148+
Write-Error "MSIX package not found at $msixPath"
149+
exit 1
150+
}
151+
152+
# ============================================================
153+
# End MSIX Build
154+
# ============================================================
155+
106156
- name: Create portable zip
107157
shell: pwsh
108158
run: |
@@ -119,6 +169,7 @@ jobs:
119169
name: |
120170
GhostDrawSetup-*
121171
GhostDraw-*-portable
172+
GhostDraw-*-MSIX
122173
failOnError: false
123174

124175
- name: Upload installer artifact
@@ -135,6 +186,14 @@ jobs:
135186
path: GhostDraw-${{ env.VERSION }}-portable.zip
136187
retention-days: 30
137188

189+
# - name: Upload MSIX artifact
190+
# if: env.BUILD_MSIX == 'true'
191+
# uses: actions/upload-artifact@v4
192+
# with:
193+
# name: GhostDraw-${{ env.VERSION }}-MSIX
194+
# path: Package/AppPackages/GhostDraw.Package_${{ env.VERSION }}_Test/*.msix
195+
# retention-days: 30
196+
138197
# Check if a PUBLISHED (non-draft) release exists for this version
139198
# If only a draft exists, we should update it with new assets
140199
- name: Check if published release exists
@@ -170,6 +229,25 @@ jobs:
170229
# Always exit successfully
171230
exit 0
172231
232+
- name: Prepare release files list
233+
if: github.event_name == 'push' && github.ref == 'refs/heads/main' && steps.check_release.outputs.skip_release == 'false'
234+
id: release_files
235+
shell: pwsh
236+
run: |
237+
$files = @(
238+
"Installer/bin/x64/Release/GhostDrawSetup-${{ env.VERSION }}.msi",
239+
"GhostDraw-${{ env.VERSION }}-portable.zip"
240+
)
241+
242+
if ($env:BUILD_MSIX -eq 'true') {
243+
$files += "Package/AppPackages/GhostDraw.Package_${{ env.VERSION }}_Test/GhostDraw.Package_${{ env.VERSION }}_x64.msix"
244+
}
245+
246+
$filesList = $files -join "`n"
247+
"files<<EOF" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
248+
$filesList | Out-File -FilePath $env:GITHUB_OUTPUT -Append
249+
"EOF" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
250+
173251
- name: Create or update draft release
174252
if: github.event_name == 'push' && github.ref == 'refs/heads/main' && steps.check_release.outputs.skip_release == 'false'
175253
uses: softprops/action-gh-release@v2
@@ -179,15 +257,14 @@ jobs:
179257
draft: true
180258
prerelease: false
181259
generate_release_notes: true
182-
files: |
183-
Installer/bin/x64/Release/GhostDrawSetup-${{ env.VERSION }}.msi
184-
GhostDraw-${{ env.VERSION }}-portable.zip
260+
files: ${{ steps.release_files.outputs.files }}
185261
body: |
186262
## GhostDraw v${{ env.VERSION }}
187263
188264
### Downloads
189-
- **GhostDrawSetup-${{ env.VERSION }}.msi** - Windows installer
265+
- **GhostDrawSetup-${{ env.VERSION }}.msi** - Windows installer (recommended)
190266
- **GhostDraw-${{ env.VERSION }}-portable.zip** - Portable version (no installation required)
267+
${{ env.BUILD_MSIX == 'true' && format('- **GhostDraw.Package_{0}_x64.msix** - Microsoft Store package (unsigned - for testing only)', env.VERSION) || '' }}
191268
192269
### Installation
193270
1. Download the MSI installer or portable ZIP

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ ClientBin/
253253
*.dbproj.schemaview
254254
*.jfm
255255
*.pfx
256+
*.cer
256257
*.publishsettings
257258
orleans.codegen.cs
258259

CHANGELOG.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,21 @@ All notable changes to GhostDraw will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## v2.0.0.0
9+
10+
### Added
11+
- **Windows Store Package**
12+
- Added windows store package project and publish first version to windows store.
13+
- Added new custom splash screen.
14+
- Add activation and tool change hint popup center bottom screen that fades away.
15+
16+
### Changed
17+
- Versioning semantics to 4-part
18+
19+
### Fixed
20+
- App settings and logging paths work in both win store package and msi or standalone.
21+
- Tray double-click about modal now shows accurate messaging based on current settings.
22+
823
## v1.0.17
924

1025
### Added
@@ -232,7 +247,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
232247

233248
### Added
234249
- **Drawing Mode Activation**
235-
- Configurable hotkey combination (default: Ctrl+Alt+D)
250+
- Configurable hotkey combination (default: Ctrl+Alt+X)
236251
- Toggle or hold mode options
237252
- **Pen Tool** - Freehand drawing with mouse
238253
- Click and drag to draw smooth polylines

GhostDraw.sln

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GhostDraw.Tests", "Tests\Gh
99
EndProject
1010
Project("{B7DD6F7E-DEF8-4E67-B5B7-07EF123DB6F0}") = "GhostDraw.Installer", "Installer\GhostDraw.Installer.wixproj", "{E1C8B89D-3F4E-4A6F-9C8E-5D7A8B9C0D1E}"
1111
EndProject
12+
Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "GhostDraw.Package", "Package\GhostDraw.Package.wapproj", "{F7D8E1A2-3B4C-5D6E-7F8A-9B0C1D2E3F4A}"
13+
EndProject
1214
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8EC462FD-D22E-90A8-E5CE-7E832BA40C5D}"
1315
ProjectSection(SolutionItems) = preProject
1416
.gitignore = .gitignore
@@ -37,21 +39,41 @@ EndProject
3739
Global
3840
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3941
Debug|Any CPU = Debug|Any CPU
42+
Debug|x64 = Debug|x64
4043
Release|Any CPU = Release|Any CPU
44+
Release|x64 = Release|x64
4145
EndGlobalSection
4246
GlobalSection(ProjectConfigurationPlatforms) = postSolution
4347
{CBCB2CF7-BFD4-47C3-8B42-73A37A8CD15F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
4448
{CBCB2CF7-BFD4-47C3-8B42-73A37A8CD15F}.Debug|Any CPU.Build.0 = Debug|Any CPU
49+
{CBCB2CF7-BFD4-47C3-8B42-73A37A8CD15F}.Debug|x64.ActiveCfg = Debug|Any CPU
50+
{CBCB2CF7-BFD4-47C3-8B42-73A37A8CD15F}.Debug|x64.Build.0 = Debug|Any CPU
4551
{CBCB2CF7-BFD4-47C3-8B42-73A37A8CD15F}.Release|Any CPU.ActiveCfg = Release|Any CPU
4652
{CBCB2CF7-BFD4-47C3-8B42-73A37A8CD15F}.Release|Any CPU.Build.0 = Release|Any CPU
53+
{CBCB2CF7-BFD4-47C3-8B42-73A37A8CD15F}.Release|x64.ActiveCfg = Release|Any CPU
54+
{CBCB2CF7-BFD4-47C3-8B42-73A37A8CD15F}.Release|x64.Build.0 = Release|Any CPU
4755
{2C665F98-F0C5-0A3F-9461-BB8A1A593CE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
4856
{2C665F98-F0C5-0A3F-9461-BB8A1A593CE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
57+
{2C665F98-F0C5-0A3F-9461-BB8A1A593CE2}.Debug|x64.ActiveCfg = Debug|Any CPU
58+
{2C665F98-F0C5-0A3F-9461-BB8A1A593CE2}.Debug|x64.Build.0 = Debug|Any CPU
4959
{2C665F98-F0C5-0A3F-9461-BB8A1A593CE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
5060
{2C665F98-F0C5-0A3F-9461-BB8A1A593CE2}.Release|Any CPU.Build.0 = Release|Any CPU
61+
{2C665F98-F0C5-0A3F-9461-BB8A1A593CE2}.Release|x64.ActiveCfg = Release|Any CPU
62+
{2C665F98-F0C5-0A3F-9461-BB8A1A593CE2}.Release|x64.Build.0 = Release|Any CPU
5163
{E1C8B89D-3F4E-4A6F-9C8E-5D7A8B9C0D1E}.Debug|Any CPU.ActiveCfg = Debug|x64
5264
{E1C8B89D-3F4E-4A6F-9C8E-5D7A8B9C0D1E}.Debug|Any CPU.Build.0 = Debug|x64
65+
{E1C8B89D-3F4E-4A6F-9C8E-5D7A8B9C0D1E}.Debug|x64.ActiveCfg = Debug|x64
66+
{E1C8B89D-3F4E-4A6F-9C8E-5D7A8B9C0D1E}.Debug|x64.Build.0 = Debug|x64
5367
{E1C8B89D-3F4E-4A6F-9C8E-5D7A8B9C0D1E}.Release|Any CPU.ActiveCfg = Release|x64
5468
{E1C8B89D-3F4E-4A6F-9C8E-5D7A8B9C0D1E}.Release|Any CPU.Build.0 = Release|x64
69+
{E1C8B89D-3F4E-4A6F-9C8E-5D7A8B9C0D1E}.Release|x64.ActiveCfg = Release|x64
70+
{E1C8B89D-3F4E-4A6F-9C8E-5D7A8B9C0D1E}.Release|x64.Build.0 = Release|x64
71+
{F7D8E1A2-3B4C-5D6E-7F8A-9B0C1D2E3F4A}.Debug|Any CPU.ActiveCfg = Debug|x64
72+
{F7D8E1A2-3B4C-5D6E-7F8A-9B0C1D2E3F4A}.Debug|x64.ActiveCfg = Debug|x64
73+
{F7D8E1A2-3B4C-5D6E-7F8A-9B0C1D2E3F4A}.Debug|x64.Build.0 = Debug|x64
74+
{F7D8E1A2-3B4C-5D6E-7F8A-9B0C1D2E3F4A}.Release|Any CPU.ActiveCfg = Release|x64
75+
{F7D8E1A2-3B4C-5D6E-7F8A-9B0C1D2E3F4A}.Release|x64.ActiveCfg = Release|x64
76+
{F7D8E1A2-3B4C-5D6E-7F8A-9B0C1D2E3F4A}.Release|x64.Build.0 = Release|x64
5577
EndGlobalSection
5678
GlobalSection(SolutionProperties) = preSolution
5779
HideSolutionNode = FALSE

Installer/GhostDraw.Installer.wixproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<Project Sdk="WixToolset.Sdk/4.0.5">
22
<PropertyGroup>
3-
<Version Condition="'$(Version)' == ''">1.0.17</Version>
3+
<Version Condition="'$(Version)' == ''">2.0.0.0</Version>
44
<OutputName>GhostDrawSetup-$(Version)</OutputName>
55
<OutputType>Package</OutputType>
66
<Platform>x64</Platform>

Installer/ISSUES.md

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)