From 4c1aba1ae2583a24ba72f547d452810b3bbe4c8a Mon Sep 17 00:00:00 2001 From: reviewer Date: Wed, 22 Jul 2026 00:15:14 +0200 Subject: [PATCH 1/4] desktop: add Microsoft Store package workflow --- .github/workflows/build-windows-store.yml | 45 ++++++++++++++++++++++ app/DISTRIBUTION.md | 22 +++++++++++ app/build/appx/Square150x150Logo.png | Bin 0 -> 16271 bytes app/build/appx/Square44x44Logo.png | Bin 0 -> 2262 bytes app/build/appx/StoreLogo.png | Bin 0 -> 2668 bytes app/build/appx/Wide310x150Logo.png | Bin 0 -> 13822 bytes app/package.json | 15 ++++++++ 7 files changed, 82 insertions(+) create mode 100644 .github/workflows/build-windows-store.yml create mode 100644 app/build/appx/Square150x150Logo.png create mode 100644 app/build/appx/Square44x44Logo.png create mode 100644 app/build/appx/StoreLogo.png create mode 100644 app/build/appx/Wide310x150Logo.png diff --git a/.github/workflows/build-windows-store.yml b/.github/workflows/build-windows-store.yml new file mode 100644 index 00000000..a7e6f034 --- /dev/null +++ b/.github/workflows/build-windows-store.yml @@ -0,0 +1,45 @@ +name: Build Windows Store package + +on: + workflow_dispatch: + pull_request: + paths: + - .github/workflows/build-windows-store.yml + - app/** + - src/** + - package.json + - package-lock.json + +permissions: + contents: read + +jobs: + appx: + runs-on: windows-latest + steps: + - uses: actions/checkout@v6 + + - uses: actions/setup-node@v6 + with: + node-version: 22.13.0 + cache: npm + cache-dependency-path: | + package-lock.json + app/package-lock.json + + - name: Install CLI dependencies + run: npm ci + + - name: Install desktop dependencies + run: npm ci --prefix app + + - name: Build Microsoft Store package + run: npm --prefix app run package:store + + - name: Upload Store package + uses: actions/upload-artifact@v6 + with: + name: CodeBurn-Microsoft-Store + path: app/release/CodeBurn-Store-*.appx + if-no-files-found: error + retention-days: 14 diff --git a/app/DISTRIBUTION.md b/app/DISTRIBUTION.md index 7bd4bd0e..69165022 100644 --- a/app/DISTRIBUTION.md +++ b/app/DISTRIBUTION.md @@ -66,6 +66,7 @@ npm --prefix app run package # macOS, both arm64 and x64 npm --prefix app run package:arm64 # macOS arm64 only (faster on Apple Silicon) npm --prefix app run package:x64 # macOS x64 only npm --prefix app run package:win # Windows NSIS installer, x64 +npm --prefix app run package:store # Microsoft Store AppX, x64 (Windows host only) npm --prefix app run package:linux # Linux AppImage, x64 ``` @@ -184,6 +185,27 @@ shows **"Windows protected your PC"**. Users click **"More info" → "Run anyway"** to launch it. This is expected for an unsigned build; the only fix is a purchased code-signing (Authenticode/EV) certificate. +### Microsoft Store (`package:store`) + +The Store build is a separate AppX target so the GitHub NSIS installer remains +unchanged. AppX packaging requires Windows 10 or newer and is built by the +manual `Build Windows Store package` GitHub Actions workflow on +`windows-latest`. Download its `CodeBurn-Microsoft-Store` workflow artifact and +upload the contained `CodeBurn-Store--x64.appx` file in Partner Center. + +The manifest identity must exactly match the reserved Partner Center product: + +- Identity name: `Codeburn.CodeBurn` +- Publisher: `CN=3EFA3336-87E1-46F2-9DFA-2EB5A7693F89` +- Publisher display name: `Codeburn` +- Store ID: `9P0R4ZL5XMB8` + +The Store package is intentionally unsigned: Microsoft signs it during Store +submission. Direct sideloading requires a separate trusted or development +certificate. The AppX declares `runFullTrust` (electron-builder's required +default for Electron apps), so CodeBurn retains access to the user's local +provider session files rather than running in a UWP application sandbox. + ### Linux (`package:linux`) `electron-builder --linux` produces a single artifact in `app/release/`: diff --git a/app/build/appx/Square150x150Logo.png b/app/build/appx/Square150x150Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f80200bd7c156d1019686b76f8eab628bb48447d GIT binary patch literal 16271 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 literal 0 HcmV?d00001 diff --git a/app/build/appx/StoreLogo.png b/app/build/appx/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..bc440fed2826cef96d167a42d68caac0ed7d7113 GIT binary patch literal 2668 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 a!2bX%enGdv>;Ojq00005?zjMyL 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 Date: Wed, 22 Jul 2026 00:18:25 +0200 Subject: [PATCH 2/4] desktop: make CLI staging portable on Windows --- app/scripts/stage-cli.mjs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/scripts/stage-cli.mjs b/app/scripts/stage-cli.mjs index 827776e1..a1075043 100644 --- a/app/scripts/stage-cli.mjs +++ b/app/scripts/stage-cli.mjs @@ -81,11 +81,15 @@ try { // Map each back to its top-level node_modules entry (`name` or `@scope/name`), // then copy those dirs whole — a package's own nested node_modules comes with // it, which is exactly the closure it needs at runtime. -const prefix = rootModules + '/' +// `npm ls --parseable` uses native separators on Windows. Normalize both sides +// before extracting the package name so Store builds do not treat a populated +// node_modules tree as empty merely because it uses `\\` instead of `/`. +const prefix = rootModules.replaceAll('\\', '/') + '/' const topLevel = new Set() for (const line of listed.split('\n')) { - if (!line.startsWith(prefix)) continue - const rest = line.slice(prefix.length) + const normalizedLine = line.trim().replaceAll('\\', '/') + if (!normalizedLine.startsWith(prefix)) continue + const rest = normalizedLine.slice(prefix.length) const match = rest.match(/^(@[^/]+\/[^/]+|[^/]+)/) if (match) topLevel.add(match[1]) } From 212f3d99912b03a36d518308f4510929807401f1 Mon Sep 17 00:00:00 2001 From: reviewer Date: Wed, 22 Jul 2026 00:21:06 +0200 Subject: [PATCH 3/4] desktop: invoke npm shim on Windows --- app/scripts/stage-cli.mjs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/scripts/stage-cli.mjs b/app/scripts/stage-cli.mjs index a1075043..aa5d361f 100644 --- a/app/scripts/stage-cli.mjs +++ b/app/scripts/stage-cli.mjs @@ -68,7 +68,10 @@ writeFileSync( // extraneous warnings, so capture stdout regardless of exit code. let listed = '' try { - listed = execFileSync('npm', ['ls', '--omit=dev', '--all', '--parseable'], { + // npm is a .cmd shim on Windows; child_process does not resolve that shim + // through a shell the way an interactive PowerShell/npm step does. + const npmExecutable = process.platform === 'win32' ? 'npm.cmd' : 'npm' + listed = execFileSync(npmExecutable, ['ls', '--omit=dev', '--all', '--parseable'], { cwd: root, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024, From 5ef385761f974d0170f0a0651a4be8f96c4b0ea0 Mon Sep 17 00:00:00 2001 From: reviewer Date: Wed, 22 Jul 2026 00:23:24 +0200 Subject: [PATCH 4/4] desktop: run npm portably during staging --- app/scripts/stage-cli.mjs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/scripts/stage-cli.mjs b/app/scripts/stage-cli.mjs index aa5d361f..69085678 100644 --- a/app/scripts/stage-cli.mjs +++ b/app/scripts/stage-cli.mjs @@ -68,10 +68,11 @@ writeFileSync( // extraneous warnings, so capture stdout regardless of exit code. let listed = '' try { - // npm is a .cmd shim on Windows; child_process does not resolve that shim - // through a shell the way an interactive PowerShell/npm step does. - const npmExecutable = process.platform === 'win32' ? 'npm.cmd' : 'npm' - listed = execFileSync(npmExecutable, ['ls', '--omit=dev', '--all', '--parseable'], { + // Execute npm's JavaScript entry point with the current Node binary. Windows + // exposes npm as a .cmd shim, which execFile cannot launch without a shell. + const npmCli = process.env.npm_execpath + if (!npmCli) throw new Error('npm_execpath is unavailable') + listed = execFileSync(process.execPath, [npmCli, 'ls', '--omit=dev', '--all', '--parseable'], { cwd: root, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024, @@ -88,10 +89,12 @@ try { // before extracting the package name so Store builds do not treat a populated // node_modules tree as empty merely because it uses `\\` instead of `/`. const prefix = rootModules.replaceAll('\\', '/') + '/' +const comparisonPrefix = process.platform === 'win32' ? prefix.toLowerCase() : prefix const topLevel = new Set() for (const line of listed.split('\n')) { const normalizedLine = line.trim().replaceAll('\\', '/') - if (!normalizedLine.startsWith(prefix)) continue + const comparisonLine = process.platform === 'win32' ? normalizedLine.toLowerCase() : normalizedLine + if (!comparisonLine.startsWith(comparisonPrefix)) continue const rest = normalizedLine.slice(prefix.length) const match = rest.match(/^(@[^/]+\/[^/]+|[^/]+)/) if (match) topLevel.add(match[1])