feat(dist): per-OS installers, release-asset upload, startup update notifier - #23
Merged
Merged
Conversation
- Move design_specs/ into docs/design_specs/ and fix relative links in the frontend spec to match the new location - Remove obsolete REMAINING_WORK planning docs - Anchor graphify-out/ ignore rule to repo root - Update sync/logo SVG assets and add sync_nas asset - Regenerate graphify-out/ knowledge-graph artifacts Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Design for: inline content-file editing, structured Copier question
form, file upload into template dirs, and per-instance template
folders (typed equipment|project|run subfolders serving as both
child-source and provenance copy). Adds template/{authoring,lint,
manifest,resolution,provenance}.py and a NiceGUI editor page;
factors §5.8 lint out of TemplateEngine.resolve into a shared module.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…otifier Harden distribution and lay the groundwork for future auto-updates. Step 1 — Release assets: build.yml now grants `contents: write` and, on a published release, attaches each OS's installer + raw archive via softprops/action-gh-release. PR/dispatch builds still upload workflow artifacts. Trigger stays `release: published`. Step 2 — Real installers (new packaging/): - Windows: Inno Setup .exe (Start-menu/desktop shortcut to the ExLab-Wizard CLI alias, uninstaller, silent WebView2 bootstrap; no autostart writes — the in-app AutostartManager owns that). - macOS: .dmg via create-dmg (hdiutil fallback) wrapping the .app. - Linux: AppImage via appimagetool (not Flatpak/Snap — sandbox breaks keyring + webview). All degrade gracefully on the absent app icon. Step 3 — Startup update notifier (new src/exlab_wizard/update_check/): one-shot daemon-thread probe of the GitHub Releases API (httpx, mirroring the LIMS client shape); on a newer tag fires one OS notification via the existing notify() wrapper and surfaces a "Check for updates…" tray item opening the releases page. Gated on config update_check.enabled (default on; offline sites set false). Notifier-only — tufup silent auto-update and code-signing remain deferred (Design Spec §15.6 / §15.8 item 3). Adds packaging>=23 (version comparison) and [project.urls]; 17 unit tests covering version compare, the HTTP fetch (ok/403/500), and the runner. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
choco install innosetup does not add ISCC.exe to the current shell PATH on the windows-latest runner, so the build step failed with "iscc not recognized". Resolve the compiler from its known install dir (with a search fallback) before invoking it. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Git-bash on windows-latest rewrites the leading-slash "/DAppVersion=..."
argument into a Windows path, so ISCC treated it as a second script
filename ("You may not specify more than one script filename"). Set
MSYS_NO_PATHCONV=1 for the compiler invocation.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The lint job's `ruff format --check .` flags these four files repo-wide (already red on main). Format them so the PR's lint check passes; no behavior change. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This was referenced May 30, 2026
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Hardens cross-OS distribution and lays the groundwork for future auto-updates. Three increments (all opted into during planning):
.exe/.dmg/.AppImageinstead of a raw zipped folder.tufupsilent auto-updater.The app already produced PyInstaller
--onedirbundles via a 3-runner matrix; previously the build only uploaded login-gated workflow artifacts (the README's "publishes under Releases" claim was aspirational). This wires the last mile.Step 1 — Release-asset upload (
.github/workflows/build.yml)permissions: contents: write.Attach assets to releasestep (softprops/action-gh-release@v2, gatedif: github.event_name == 'release') uploads each OS's installer + raw archive to the published release; matrix jobs append to the same tag.release: published(publish-triggered, per decision). PR/dispatch builds still smoke-test +upload-artifact.Step 2 — Per-OS installers (new
packaging/).exe: installs the onedir to Program Files, Start-menu/desktop shortcuts to theExLab-Wizard.exeCLI alias, uninstaller, silent WebView2 Evergreen bootstrap (pywebview needs it). No autostart registry writes — the in-appAutostartManagerowns that, avoiding double-registration..dmgviacreate-dmg(withhdiutilfallback) wrapping the existing.app.appimagetool. Deliberately not Flatpak/Snap — their sandboxes breaksecretstorage(keyring) + GTK-WebKit (webview).assets/icons/yet).Step 3 — Startup update notifier (new
src/exlab_wizard/update_check/)StatusTicker) → GitHub Releases API viahttpx(reusing the LIMS client shape, required GitHubUser-Agent).notify()wrapper + a "Check for updates…" tray item opening the releases page.config.update_check.enabled(default on, per decision; offline sites setfalse).tufupsilent auto-update and code-signing remain deferred (Design Spec §15.6 / §15.8 item 3).Also adds
packaging>=23(version comparison) and[project.urls].Test plan
ruff check/ruff format --checkclean on all touched filesmypy src/exlab_wizard/update_check— no issuespytest tests/unit/update_check tests/unit/tray tests/unit/config(incl. 17 new tests covering version compare, HTTP fetch ok/403/500, runner newer/equal/none)on:= pull_request / release / workflow_dispatch)tests/unit/sync/test_nas_client*timing flakes — confirmed identical on the clean tree (changes stashed); unrelated to this PRv0.0.0-rc1tag) and per-OS installer smoke are manual follow-ups before the first real releaseReleasing
Bump
__version__(src/exlab_wizard/__init__.py+pyproject.tomlin lockstep), then publish a GitHub Release on thevX.Y.Ztag → CI builds and attaches all three installers.🤖 Generated with Claude Code