From ae7efb6acf0133c37c590df9aeffcd17d30f74a0 Mon Sep 17 00:00:00 2001 From: Yun Chan Date: Sat, 19 Sep 2026 08:24:03 +0900 Subject: [PATCH] fix(desktop): render popup overlays in packaged builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Popup pages loaded their scripts as classic + + diff --git a/apps/desktop/src/renderer/popups/command-popup/index.html b/apps/desktop/src/renderer/popups/command-popup/index.html index 664087f..996a62f 100644 --- a/apps/desktop/src/renderer/popups/command-popup/index.html +++ b/apps/desktop/src/renderer/popups/command-popup/index.html @@ -19,6 +19,7 @@ - + + diff --git a/apps/desktop/src/renderer/popups/history-popup/index.html b/apps/desktop/src/renderer/popups/history-popup/index.html index 780a1fb..0a461e5 100644 --- a/apps/desktop/src/renderer/popups/history-popup/index.html +++ b/apps/desktop/src/renderer/popups/history-popup/index.html @@ -17,6 +17,7 @@ - + + diff --git a/apps/desktop/src/renderer/popups/recording-tip/index.html b/apps/desktop/src/renderer/popups/recording-tip/index.html index 58ea4ba..623064c 100644 --- a/apps/desktop/src/renderer/popups/recording-tip/index.html +++ b/apps/desktop/src/renderer/popups/recording-tip/index.html @@ -34,6 +34,7 @@ - + + diff --git a/apps/desktop/src/renderer/popups/result-popup/index.html b/apps/desktop/src/renderer/popups/result-popup/index.html index 552fe47..6457d33 100644 --- a/apps/desktop/src/renderer/popups/result-popup/index.html +++ b/apps/desktop/src/renderer/popups/result-popup/index.html @@ -23,6 +23,7 @@ - + + diff --git a/docs/map/00-index.md b/docs/map/00-index.md index 6599721..3cff6b7 100644 --- a/docs/map/00-index.md +++ b/docs/map/00-index.md @@ -2,6 +2,7 @@ > Status: ACTIVE > Last full audit: 2026-09-13 +> Last update: 2026-09-19 β€” GAP-INFRA-05 (desktop renderer popup bundle verification wired into CI) > Scope: entire monorepo `D:/workspace/D3ROVoice` at product version `1.3.6` > Purpose: let any agent (or human) answer two questions in under a minute: > 1. **What infrastructure exists?** (build, CI, services, APIs, data, packages, deploy) diff --git a/docs/map/02-infrastructure.md b/docs/map/02-infrastructure.md index d8233ab..fabfa53 100644 --- a/docs/map/02-infrastructure.md +++ b/docs/map/02-infrastructure.md @@ -78,6 +78,7 @@ npm run release:metadata[:test] npm run release:forgejo[:check] # canonical Forgejo publisher/feed npm run release:tag # annotated/signed immutable release tag npm run security:secrets[:test] # hardcoded-secret scanner +npm run check:desktop-renderer[:test] # built renderer pages reference only assets on disk npm run test:e2e:red # content-report red e2e npm run release:mobile:boundary[:test] npm run release:mobile:config[:test] @@ -136,7 +137,7 @@ See [`03-shared-packages.md`](./03-shared-packages.md). Summary: ### GitLab CI (`.gitlab-ci.yml`) -Stages `validate β†’ test β†’ build β†’ e2e β†’ package β†’ publish β†’ deploy`. Primary pipeline for desktop Windows/macOS releases (Forgejo Generic Registry is the canonical updater feed; GitLab project 1172 is a legacy mirror) and production mobile releases (`mobile-production-release`, manual/protected). Admin NAS deploy job is intentionally **disabled**. `package-windows`/`package-macos` build the faster-whisper sidecar (`sidecar:setup` β†’ `sidecar:build`) and run `scripts/ci/verify-sidecar-bundle.mjs` before electron-builder, so a release can never ship without the local STT engine. +Stages `validate β†’ test β†’ build β†’ e2e β†’ package β†’ publish β†’ deploy`. Primary pipeline for desktop Windows/macOS releases (Forgejo Generic Registry is the canonical updater feed; GitLab project 1172 is a legacy mirror) and production mobile releases (`mobile-production-release`, manual/protected). Admin NAS deploy job is intentionally **disabled**. `package-windows`/`package-macos` build the faster-whisper sidecar (`sidecar:setup` β†’ `sidecar:build`) and run `scripts/ci/verify-sidecar-bundle.mjs` before electron-builder, so a release can never ship without the local STT engine. Every pipeline that runs `npm run build --workspace=@d3ro/desktop` (`.forgejo` release/portable, `.github` CI/release) then runs `scripts/ci/verify-desktop-renderer-bundles.mjs`, which fails packaging when a renderer page references an asset the build did not emit (GAP-INFRA-05). ### Forgejo Actions (`.forgejo/workflows/`) `portable.yml` β€” νƒœκ·Έ/μˆ˜λ™ μ‹€ν–‰μœΌλ‘œ **μ„œλͺ… 없이** portable 채널(95MiB 7z λΆ„ν•  λ³Όλ₯¨ + Scoop λ§€λ‹ˆνŽ˜μŠ€νŠΈ + μ„€μΉ˜ 슀크립트)을 κ²Œμ‹œν•œλ‹€. `WIN_CSC_*` λΆˆν•„μš”, updater feedλŠ” κ±΄λ“œλ¦¬μ§€ μ•ŠλŠ”λ‹€. diff --git a/docs/map/04-desktop-app.md b/docs/map/04-desktop-app.md index dd6e5df..317ae42 100644 --- a/docs/map/04-desktop-app.md +++ b/docs/map/04-desktop-app.md @@ -146,6 +146,12 @@ Preload exposes **`window.electronAPI`** with 33 namespaces: `platform, audio, c `windows/WindowManager.ts` creates 6 windows: main (borderless, custom TitleBar; macOS `hiddenInset`), recording-tip, result-popup, history-popup, command-popup, caption-overlay. Injects popup theme CSS + i18n strings; 2-phase resize. `windows/TrayManager.ts` β€” tray icon + menu + double-click show. +**Popup invariants** (each shipped broken once β€” do not regress): + +- νŒμ—… HTML의 μŠ€ν¬λ¦½νŠΈλŠ” λ°˜λ“œμ‹œ `') + const goodProblems = collectProblems(goodRoot, pages) + if (goodProblems.length !== 0) { + failures.push(`complete build reported problems: ${goodProblems.join('; ')}`) + } + + const brokenRoot = path.join(tmpRoot, 'broken') + bundlePage(brokenRoot, '') + const brokenProblems = collectProblems(brokenRoot, pages) + if (!brokenProblems.some((problem) => problem.includes('missing asset'))) { + failures.push('missing asset was not detected') + } + if (!brokenProblems.some((problem) => problem.includes('classic script'))) { + failures.push('classic script tag was not detected') + } + + const missingPageProblems = collectProblems(goodRoot, ['popups/absent/index.html']) + if (!missingPageProblems.some((problem) => problem.startsWith('missing built page'))) { + failures.push('missing page was not detected') + } + } finally { + rmSync(tmpRoot, { recursive: true, force: true }) + } + + if (failures.length > 0) { + console.error('verify-desktop-renderer-bundles self-test failed:') + for (const failure of failures) console.error(`- ${failure}`) + process.exit(1) + } + console.log('verify-desktop-renderer-bundles self-test: OK') +} + +if (process.argv.slice(2).includes('--self-test')) { + selfTest() +} else if (!existsSync(builtRendererDir)) { + console.error(`Renderer build not found: ${builtRendererDir}`) + console.error(' build: npm run build --workspace=@d3ro/desktop') + process.exit(1) +} else { + const pages = expectedPages() + const problems = collectProblems(builtRendererDir, pages) + + if (problems.length > 0) { + console.error('Desktop renderer bundle verification failed:') + for (const problem of problems) console.error(`- ${problem}`) + console.error(' rebuild: npm run build --workspace=@d3ro/desktop') + process.exit(1) + } + + console.log(`Desktop renderer bundle verification passed: ${pages.length} page(s) with all assets on disk`) +} \ No newline at end of file