Repository navigation
Merge wails v3.0.0 release into integration - #7
Merged
Merged
Conversation
* fix(devmode): Add refresh http readiness check * chore(gomod): Bump atterpac/refresh v1.1.4 --------- Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
…aving a blank window (wailsapp#6002) * [windows] Recover from WebView2 process failures instead of leaving a blank window Register CoreWebView2's ProcessFailed event (previously unhandled). Renderer exited/unresponsive -> re-navigate to the last host-set URL. Browser process exited -> rebuild the controller on a fresh edge.Chromium instance and restore the last URL; the old instance cannot be re-embedded because Embed's init-wait loop keys on a per-instance flag a used instance has already set. Without this, any browser-process death (crash, GPU-kill exhaustion, external kill of msedgewebview2) leaves every controller COM call failing with ERROR_INVALID_STATE (0x8007139F) and the window permanently blank until the host app is restarted. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(v3/windows): bound WebView2 process-failure recovery and stop it drifting from startup Adapts the process-failure recovery from wailsapp#5733 to current master and closes the gaps that showed up rebasing it off v3.0.0-alpha2.112. Share one Chromium construction path. The original rebuild carried its own copy of run()'s construction, which was accurate at alpha2.112 when that was just NewChromium plus SetErrorCallback. run() has since grown three more pre-Embed settings, so a rebuilt window silently lost non-client region support, dropped from composition hosting to windowed while options.WebView2CompositionHosting stayed true, and lost cursor handling. newChromium is now the only place that construction lives, so the two paths cannot drift again. Restore the last navigation from setupChromium rather than after it. setupChromium already navigates on its way out, so navigating again from the rebuild loaded the start URL and immediately threw it away for the real one. Folding the restore into that existing branch also fixes an options.HTML window recovering into a window that is never shown: the NavigateToString branch left webviewNavigationCompleted set from the dead controller's last navigation, and navigationCompleted uses that flag to skip the Hide/Show visibility hack — so recovery completed onto exactly the blank window it exists to prevent. Bound the attempts. A rebuilt controller that dies again re-enters the same handler, so an unrecoverable runtime turned recovery into a hot loop spawning WebView2 processes. Recovery now gets maxWebviewRecoveryAttempts consecutive tries, reset by any completed navigation, so a working recovery costs nothing and a broken one degrades to the pre-existing blank window instead of looping. RENDER_PROCESS_UNRESPONSIVE re-fires for as long as the renderer stays hung, so the bound covers re-navigation too. Guard the rebuild against teardown, since shutting the app down kills the WebView2 processes and a failure racing destroy would otherwise embed into a window that is going away. The failure-kind policy and the attempt budget are split into webviewRecoveryActionFor and beginWebviewRecovery, which touch no COM and are covered by unit tests. The rest of the path needs a live WebView2 runtime; the manual matrix is in the pull request. Refs wailsapp#5733, wailsapp#5705 Co-authored-by: rmurphy <rmurphy@fortressinfosec.com> Co-authored-by: taliesin-ai <bot@taliesin.ai> Signed-off-by: taliesin-ai <bot@taliesin.ai> * test(v3/windows): match the build tag of the file under test webview_window_windows.go is `windows && !server`, so tagging its test plain `windows` broke `go test -tags server` for the package: the test file compiled without any of the declarations it references. Note that dialogs_windows_internal_test.go has the same mismatch and already breaks that build on master; left alone here as unrelated. Co-authored-by: taliesin-ai <bot@taliesin.ai> Signed-off-by: taliesin-ai <bot@taliesin.ai> * fix(v3/windows): only reset the recovery budget on a successful navigation A dead render process leaves WebView2 on an error page, and that error page fires NavigationCompleted like any other load. Resetting the attempt budget there handed a crash-looping renderer a fresh budget every cycle, so the bound never tripped — reintroducing exactly the runaway it was added to stop. Gate the reset on ICoreWebView2NavigationCompletedEventArgs::IsSuccess, whose vtbl slot was already declared but had no accessor; add one following the existing BOOL out-param pattern. An unreadable IsSuccess counts as unsuccessful, since assuming success is the failure mode that loops. Also guard the renderer re-navigation against teardown. rebuildWebView already bails when the window is being destroyed; the deferred Navigate had the same race and no guard. Both found by CodeRabbit on the pull request. Co-authored-by: taliesin-ai <bot@taliesin.ai> Signed-off-by: taliesin-ai <bot@taliesin.ai> * fix(v3/windows): run the process-failure restore after the ProcessFailed handler returns InvokeAsync runs its function inline when the caller is already on the main thread, and the ProcessFailed callback always is: WebView2 delivers it through the message loop. The recovery restore therefore ran inside the event handler, where WebView2 never delivers a new controller's creation callback — a browser-process kill made Embed pump for 30 seconds inside the handler and then exit the process via errorCallback. The WebView2 ProcessFailed documentation requires scheduling the work "to take place after completion of the event handler". Hopping off the main thread first forces dispatchOnMainThread to post, so the handler returns before the restore runs. Validated on Windows 11 26200 / WebView2 151.0.4129.93: repeated browser-process kills recovered 0/8 inline and 8/8 posted (with the message-wait fix in the next commit), ~0.5s per recovery. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(v3/windows): wake the embed wait for input already in the queue pumpUntilInited waited with MsgWaitForMultipleObjects, which only wakes for input that arrives after the wait is entered. A message posted between the drain loop and the next wait was therefore invisible until some later message happened to arrive, and the controller-creation completion could sleep out the whole 30s deadline. Two live symptoms: - A WebView2CompositionHosting window fails at plain startup, deterministically, since the wait/deadline rework: bisects to 8e08788 (wailsapp#5952); the parent commit and v3.0.0-beta.4 both start fine on the same machine. - WebView2 process-failure recovery (wailsapp#6002): even with the restore correctly posted out of the ProcessFailed handler, rebuilds wedged in 1 of 6 browser-kill trials on the busy post-crash queue. MsgWaitForMultipleObjectsEx with MWMO_INPUTAVAILABLE also returns when matching input is already available. With it, composition-hosted startup works again and posted rebuilds recover 8/8. Validated on Windows 11 26200 / WebView2 151.0.4129.93. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(v3/windows): release the abandoned instance's DComp target before a controller rebuild An HWND can carry only one DirectComposition target. After a browser-process exit the abandoned Chromium's DComp target is still bound to the window, so the replacement's composition setup fails with DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED and falls back to windowed hosting: a WebView2CompositionHosting window recovered with the wrong hosting mode, visible only as one log line and a changed child-window tree (Chrome_RenderWidgetHostHWND and Intermediate D3D Window appear). Releasing the old composition controller and host before creating the replacement keeps the recovered window composition-hosted; the post-recovery child-window set matches the pre-failure one. Validated on Windows 11 26200 / WebView2 151.0.4129.93. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(v3/windows): contain failures during WebView2 recovery Return controller initialization errors during recovery, clean up partial controllers, ignore late callbacks, and preserve quit messages. Recover HTML renderer failures and prevent overlapping recovery attempts. Keep initial startup failures fatal. Co-authored-by: rmurphy <rmurphy@fortressinfosec.com> * fix(v3/windows): address WebView2 recovery review findings --------- Signed-off-by: taliesin-ai <bot@taliesin.ai> Co-authored-by: rmurphy <rmurphy@fortressinfosec.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Lea Anthony <lea.anthony@gmail.com> Co-authored-by: taliesin-ai <taliesin-ai@users.noreply.github.com>
…s): recover from WebView2 process failures instead of leaving a blank window
…6144) Recover the implementation and tests from closed PR wailsapp#6050 after its temporary base branch was deleted. Port the permission docs to the current M-Press tree and refresh the translation audit records. Co-authored-by: taliesin-ai <bot@taliesin.ai> Co-authored-by: stefan <stefan@znipp.ch> Co-authored-by: Atterpac <89053530+atterpac@users.noreply.github.com>
…elease (wailsapp#6184) Go-allocated WebView2 handlers were passed to native code as raw addresses while their AddRef/Release returned 1 without holding any Go reference. Once a window dropped an abandoned or replaced Chromium, the GC could free handlers that WebView2 still referenced, e.g. a controller completion delivered after the embed timeout. Handler AddRef/Release now count native references in a registry keyed by the handler pointer, which keeps the handler and its Chromium reachable until the final Release. ShuttingDown drops host callbacks so a retained instance does not also retain its window. Fixes wailsapp#6168 Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
…s): keep WebView2 callback handlers alive until native release
) * fix(linux): do not treat opening the tray menu as a click Right-clicking a tray icon ran the click handler as well as opening the menu, so an app that shows its window on click had the window toggle on every right-click — and with an attached window, toggle again on the next one. The dbusmenu "opened" event says the host is about to show the context menu, which is the secondary button. ItemIsMenu is published as false, so a primary click arrives as Activate and is already handled there; the menu-open path only needs to run the onMenuOpen callback. * docs: changelog entry * docs: reference the PR in the changelog entry * test(linux): cover tray menu-open vs click dispatch Pins the fix: Event("opened") must run onMenuOpen and not the click handler, Event("closed") must run onMenuClose and not the click handler, and Activate — the path a primary click actually arrives on — must still run it. * test(linux): assert tray events run only their own callback Each assertion now pins the whole set of click / onMenuOpen / onMenuClose counts rather than the one callback it is about, and Activate is checked against a tray that has the menu callbacks attached, so an event reaching a callback it should not fails the test. --------- Co-authored-by: stefan <stefan@znipp.ch> Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
…6204) (wailsapp#6221) docs(v3): correct macOS media authorization guidance Clarify that PermissionDeny does not replace usage descriptions or prevent earlier system authorization. Apply the correction to English and all nine translations. Fixes wailsapp#6204.
…rect macOS media authorization guidance (fixes wailsapp#6204)
… the app or strand its controller (wailsapp#6220) Cockpit patch eac6c1702f5e4a62f6101b52a153c1bfbd20117bbb289c3b6ec454dc650f6bf4 Co-authored-by: taliesin-ai <281494191+taliesin-ai@users.noreply.github.com> Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
…[v3][Windows] WebView2 recovery failures can still exit the app or strand its controller
…ailsapp#6222) * fix(v3/windows): finish WebView2 recovery error handling and cleanup Return background and DevTools setup failures to recovery, close abandoned and failed controllers, and keep commands safe after budget exhaustion. Verify native Windows recovery with transient and persistent fault injection in development and production builds. * fix(v3/windows): address recovery review findings Assert the startup fatal diagnostic as well as exit status. Preserve clear WebView backgrounds for transparent and translucent windows, and verify native colour arguments across the live recovery matrix. --------- Co-authored-by: taliesin-ai <281494191+taliesin-ai@users.noreply.github.com>
…s): finish WebView2 recovery error handling and cleanup
Fixes wailsapp#6123. Co-authored-by: taliesin-ai <281494191+taliesin-ai@users.noreply.github.com>
…lete setup wizard and show system details
Fixes wailsapp#6223. Co-authored-by: taliesin-ai <281494191+taliesin-ai@users.noreply.github.com>
… macOS app output outside file providers
fix(v3): embed parent vtable chain in webview2 derived interface vtables Derived ICoreWebView2* vtable structs embedded only IUnknownVtbl plus their own methods, so calls resolved to the wrong COM vtable slot. Embed the parent vtable (ICoreWebView2 -> _2 -> ... -> _27, and X -> X2 -> X3 for siblings; EnvironmentOptions2..8 stay IUnknown-derived). Add a GOOS-independent AST-based test asserting the chain and slot counts (e.g. _22 = 125 slots). Fixes wailsapp#6129 Co-authored-by: taliesin-ai <281494191+taliesin-ai@users.noreply.github.com> Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
…pp#6306) * fix(v3/windows): restore webview focus on activation and let Tab leave the webview (wailsapp#3783) Handle MoveFocusRequested so Tab/Shift+Tab off the page hands focus to the native window instead of wrapping inside WebView2, and Tab from the host re-enters the webview. Call MoveFocus(PROGRAMMATIC) on WM_ACTIVATE, since activation restores focus to the WebView child HWND without the host receiving WM_SETFOCUS. * test: wait for stream close bookkeeping before capacity assertions * fix: preserve Ctrl+Tab bindings during WebView focus handoff --------- Co-authored-by: taliesin-ai <281494191+taliesin-ai@users.noreply.github.com> Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
Keep the existing credits and French MDX intact, remove the retired translation pipeline and build-time API calls, and retain both documentation hostnames. Refs wailsapp#6341.
docs(v2): retire Crowdin after the final translation sync
…ire Crowdin after the final translation sync
…lsapp#6343) * chore(v2): update labstack/echo to 4.16.1 and goldmark to 1.7.17 for security fixes Fixes the Dependabot alerts for GHSA-cxf3-9h37-7rr8 (critical), GHSA-9969-6676-49h5, GHSA-f48p-c9v4-h7xv and GHSA-h7wr-284f-5qvc in v2 and its examples, and GO-2026-5320. echo 4.16.1 and the golang.org/x modules it requires declare go 1.26.0, so the v2 module's go directive moves from 1.25.0 to 1.26.0. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * docs(v2): document Go 1.26 for the panic-recovery example The module now requires go 1.26.0. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
… context (wailsapp#6342) * fix(v3/windows): menu bar painting never panics on an unusable device context (wailsapp#6311) WM_UAHDRAWMENUITEM drew on UAHMENU.hdc unchecked, and the SetTextColor wrapper panics on failure, so a DC some Windows builds hand over took the whole app down while painting the menu bar. The handler now uses a valid DC (UAHMENU.hdc, else the DRAWITEMSTRUCT's), leaves the item to Windows' default drawing when neither is usable, and every menu painting path uses a non-panicking TrySetTextColor. UAHMENUITEM.Position is a C int: as a Go int it read four bytes of the metrics into the item position on 64-bit. * fix(v3/windows): contain menubar painting failures and tolerate a CLR_INVALID text colour (wailsapp#6311) TrySetTextColor now compares only the low 32 bits of the result and, when the call returns CLR_INVALID, reads the colour back: a DC whose previous text colour is CLR_INVALID makes a successful call look like a failure. MenuBarWndProc now recovers from any panic in the drawing code and leaves a message with a nil lParam to Windows' default handling, so a painting failure can never take the app down. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * fix(v3/windows): never call SetBkMode on a DC that rejected the text style, and keep the tests 32-bit safe (wailsapp#6311) Adds TrySetBkMode and uses it with TrySetTextColor in every menubar painting path, skipping the item when either fails. The tests use an all-ones handle instead of a 64-bit constant so the package still builds for windows/386, and create their memory DC with the raw call so an unavailable DC skips the test. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: taliesin-ai <taliesin-ai@users.noreply.github.com> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
…ilsapp#6358) fix(v3/windows): keep uxtheme.dll loaded for dark-mode windows (wailsapp#6356) pkg/w32's init resolved uxtheme ordinal functions into package-level variables and then freed the module. applyDarkMode calls those pointers later, so the call can jump into unmapped memory and crash the first window on some Windows builds. Keep the module loaded for the process lifetime while those pointers are in use.
…ing restart (wailsapp#6350) fix(v3/updater): hand the staging directory to the swap helper Restart spawns a detached helper that waits for this process to exit before renaming the staged payload over the installed application, then returns without retaining any claim on the staging directory. A DownloadAndInstall arriving during that wait begins with discardStaging, which removes the very directory the helper is about to install from. os.RemoveAll is depth-first, and a staged .app bundle is a directory, so the helper is left holding a path whose contents have been unlinked — and os.Rename succeeds on a directory whether or not it still holds anything. The swap reports success and discards the backup, leaving an empty application with nothing to roll back to. Restart also accepts a second call while the first helper is pending. The built-in window starts a Restart per click, so a double click starts a second helper against the same target. Restart now reads the staged path, takes the staging directory and marks a restart as pending in one critical section, and returns ErrRestartPending if one already is. discardStaging makes the same check under the same lock, so DownloadAndInstall returns ErrRestartPending rather than deleting a payload a helper owns; either Restart finds nothing staged or the download finds the helper's claim. A helper that fails to start, or never signals readiness, hands ownership back, so a failed spawn does not strand the payload and block every later attempt. Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
…tions (wailsapp#6360) Carry forward the payload validation and rollback implementation from wailsapp#6352, rejecting malformed manifests and validating staged bundles using their destination type. Fixes wailsapp#6351. Co-authored-by: Julian Storer <julianstorer@gmail.com>
* chore(release): mark Wails v3.0.0 as stable in repository metadata Point the READMEs, contributor guide, issue/PR templates and v3 project docs at the v3.0.0 stable release: version badge and install commands pin v3.0.0, contributors are directed to releases/v3.0.0, and example versions in templates drop the beta suffix. Ported from the parked wip/v3.0.0-prep work, excluding non-release changes (CodeRabbit acknowledgement line). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(release): target Wails v3.0.0 and pin links to releases/v3.0.0 Describe v3.0.0 as the stable desktop release across all languages, pin install commands to @v3.0.0, and point repository links, the edit URL and the contribution branch at releases/v3.0.0. Repository-wide policy links (CONTRIBUTING, CODE_OF_CONDUCT) stay on master. Ported from the parked wip/v3.0.0-prep work, which targeted the old .mpd sources: both trees were converted with `mpress convert --to markdown` and three-way merged onto master's .md files. Translation audit exceptions are rehashed only where they matched master before the edit; already-stale entries are left untouched. The M-Press 1.0.19 bump is not included. Validated: check_translations.py (0 errors, warning set unchanged from master), mpress build --strict, mpress check, check_site.py. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore: split agent instructions by owning directory Describe the repository layout and release policy in the root AGENTS.md and add per-area AGENTS.md files for v2, v3, docs, website, scripts, tools and assets. Deeper files may add constraints for their subtree but do not override the root. Subsystem paths now carry their v3/ prefix and point at the Markdown docs sources. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs: document M-Press v1.0.19 and acknowledge CodeRabbit Pin the docs setup task and contributor instructions to M-Press v1.0.19, the version the docs build script already resolves as the latest release. Thank CodeRabbit for supporting Wails with AI code reviews. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(v3): update klauspost/compress, x/image and Go toolchain for vulnerability fixes Fixes GHSA-259r-337f-4rfw, GO-2026-6222/5066/5062/5061/4961 and GO-2026-6809. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * chore(website): update launch-editor and follow-redirects lockfiles Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * chore: update vite to a patched release in examples, runtime, setup wizard and templates Fixes six vite advisories (GHSA-9jrq-w75r-8gcw, GHSA-rq7h-c2jc-7f22, GHSA-vfpm-58rq-9qcg, GHSA-r825-w8mm-5pxw, GHSA-587h-7wmj-h5pm, GHSA-698v-4r3x-3vcv). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * fix(linux): block reserved wails: messages from child frames (GHSA-2p5f-2gx8-mh8m) WebKitGTK passes no frame info to the external script message handler, so inject a document-start, all-frames user script that replaces the handler in child frames with a wrapper dropping wails:-prefixed messages. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * docs(security): update supported versions and document known iframe limitations Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * chore(ci): remove the keyword auto-labeler and add the triage agent policy The keyword classifier defaulted unclassified issues to Enhancement, which triggers the redirect workflow that closes the issue, and its high-priority label could be set by anyone through keywords. Labelling is now done by the maintainers' triage tooling, governed by .github/triage/AGENT_PROMPT.md. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * docs(triage): let the triage agent apply release-blocking labels with evidence Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * ci: stop running the Claude workflow on newly opened or assigned issues Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * feat(release): nightly and weekly release policy by version shape Nightlies are v<M>.<m+1>.0-nightly.<date> pre-releases (npm next); weeklies are v<M>.<m+1>.0 releases (Latest, npm latest); hotfixes are explicit patch releases. Go's @latest picks the highest release version, so nightlies never become @latest. Also fixes wails3 update cli for v3 tags (filter, pagination, cmd/wails3 path). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * fix(templates): pin @wailsio/runtime to the CLI version Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * ci(release): weekly release workflow, green-commit selection and release gate Adds the Sydney-time weekly schedule, find-green-commit.sh, check-release-blockers.sh, tag-triggered npm publish with dist-tags, releases/** CI triggers and the release policy doc. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * ci: stop running the Claude workflow on issue comments Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * ci: remove the Claude Code workflow Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * feat(changelog): write entries with Claude Haiku 5.5 and add an A/B mode The model is now configurable (CHANGELOG_MODEL), reasoning is requested off with a single retry if a model rejects that, and AB_MODELS/AB_PRS compare models on real merged PRs without touching the changelog. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * feat(changelog): steer the model to Security for vulnerability fixes and user-facing wording Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * docs: audit v3.0.0 release documentation (wailsapp#6337) * docs: make M-Press contribution workflow clear and discoverable (wailsapp#6337) * docs(v3): consolidate release documentation on the preparation branch Bring over the Diataxis navigation and v2 recovery page, correct documentation PRs to target master, and place the documentation guide under Contributing. Update credits and retain the release article and AV1 film as a review draft outside published content. Refs wailsapp#6337, wailsapp#6340, wailsapp#6341. Verified the full M-Press build and link check. The nine existing release-policy locale gaps remain; the draft adds no coverage errors. CodeRabbit review finding about draft translation coverage addressed by keeping the unpublished article in docs/mpress/drafts. * docs(v3): refine release announcement and installation example Use the Introducing Wails v3 thumbnail for the release draft, explain nightly prereleases and weekly minor releases, and acknowledge the support backlog and automation. Replace the installation doctor placeholder with v3.0.0 in English and all nine locale copies. Refs wailsapp#6337. Preview build and link checks passed; CodeRabbit reviewed all 11 changed files with no new findings. * ci(release): port the weekly release gate to Go Adds v3/tasks/releasegate, a stdlib-only Go port of .github/scripts/check-release-blockers.sh with the same rules, environment variables, defaults, exit codes (0/1/2), report format, status-comment marker and fail-closed semantics. It talks to the GitHub REST API directly (GH_TOKEN, falling back to GITHUB_TOKEN; GITHUB_API_URL overrides the base) and follows Link-header pagination. The bash script needs bash 4 (declare -A), so neither it nor its tests ran on macOS. The Go tests run the original TestGate_* cases in-process against an httptest fake, plus fail-closed (403/404/500, malformed JSON, per-item failures), pagination, token, report-output and code-scanning cases. Unlike the script, an alert whose path or severity field is empty is no longer mis-parsed: bash `read` collapsed empty tab-separated fields and shifted the rest, which silently dropped such alerts. * ci(release): run the Go release gate and remove the bash script The weekly "Release gate" step now runs `go run ./tasks/releasegate` from v3 (after checkout and setup-go) with the same environment. The bash script and its bash-driven test are removed, the release policy doc points at the Go source, and the docs/automation CI job now also tests the gate. * ci(release): the gate fails closed when it cannot tell who set a blocker label A 5xx, rate limit or network error while checking a label's applier made the label count as set by a non-maintainer: ignored, and the release could pass. Only a 404 is a definite 'not allowed' now; any other failure is 'could not evaluate' (exit 2), as the gate's fail-closed rule says. * chore(deps): bump happy-dom to 21.0.4 and serialize-javascript to 7.1.x in v3 runtime Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * chore(deps): bump happy-dom to 21.0.4 and cross-spawn to 6.0.6 in v2 runtime Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * chore(deps): bump serialize-javascript, fast-uri, body-parser and tar in website lockfiles Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * docs(v3): translate release policy and link it from contributing Add nine translations with reviewed translation state and navigation entries in all ten languages. Align the release gate path and clarify pinned-version and nightly examples. Refs wailsapp#6337. * docs(v3): finish release blog draft for publication Add the full-screen viewing caption, remove editorial notes, and simplify the v2 support wording. Keep the post outside published content until the code release. Refs wailsapp#6337. * feat(release): publish nightlies under the npm dist-tag nightly and guard npm/Go version lockstep Nightly pre-releases use the dist-tag `nightly` instead of `next`. A new test asserts that the runtime package.json and package-lock.json versions equal version.txt without its leading v, so the npm version and the Go release tag cannot drift apart. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Potential fix for pull request finding 'CodeQL / Workflow does not contain permissions' Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> * docs(v3): thank v2 translators and explain v3 automated translations in the release post Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * docs(v3): correct release guides and synchronise translations Address the documentation accuracy audit in wailsapp#6337, align all locale navigation and updated guides, prepare release-post translations as drafts, and serve contributor images from the v3 site. * docs(agents): clarify generated changelogs and Wails MCP workflows * fix(release): restore the weekly release model Nightlies are dated previews of the next weekly (vX.Y.0-nightly.YYYYMMDD), weekly releases bump the minor (Sunday 20:00 Sydney, newest green master commit) and hotfixes bump the patch. This reverts the manual 'feature release' model introduced in 0b5c06b and the v3.1.0 feature-scope wording on the status page, and keeps that commit's version-only sync back to master so dependency updates merged after a weekly's commit are preserved. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * ci: drop PR edits to the generated v3/UNRELEASED_CHANGELOG.md Auto Changelog (v3) writes the entry after merge and the release tooling resets the file, so edits in ordinary PRs only cause merge conflicts between PRs. On pull_request_target the file is put back to the base branch's version on the PR branch through the contents API (no PR code is checked out or run), with a comment explaining why. Release PRs (bump/*), github-actions[bot] PRs and PRs labelled allow-changelog-edit are exempt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(v3): thank Valerio Tesei in the release post Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(v3): translate the Valerio Tesei thank-you in the release post drafts Regenerated with M-Press v1.0.24 (translate --scope stale): one new segment in each of the nine locales. The post stays a draft until v3.0.0 ships. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(v3/wake): make the precondition template test pass on Windows The guard used POSIX-only commands (true, command -v, /dev/null), but wake runs preconditions through cmd /C on Windows, where true does not exist. Use exit 0 / exit 1, which behave the same under sh -c and cmd /C. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(v3): refresh the release policy translations Regenerated the changed segments with M-Press v1.0.24 so all nine locales match the English page (draft banner removed, weekly model wording). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(v3): publish the v3.0.0 release post Move the release post and its nine translations from docs/mpress/drafts into the blog, with their translation state, remove draft: true and set the date to 2026-10-26. Built and checked with M-Press v1.0.24. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(v3/updater): only fall back to plutil for binary Info.plist files On macOS a plist that failed the strict XML reader was retried with plutil, whose parser accepts XML the reader rightly rejects (an unclosed dict, content after </plist>). Malformed XML plists therefore passed validation on darwin only, failing TestValidatePayloadRejectsMalformedPlist on darwin/arm64. Keep plutil for real binary plists (the bplist header). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(docs): validate generated blog RSS against published posts Remove the empty imported feed; M-Press v1.0.25 generates RSS during the build. Validate item coverage, metadata and duplicates so an empty feed cannot pass the site checks. Release preparation: wailsapp#6344. * fix(docs): retain mobile menu styling with M-Press 1.0.25 Update the two mobile header selectors to the namespaced menu control. Compared every generated HTML file and asset between the published 1.0.24 and 1.0.25 binaries; after this change, HTML, CSS and JS differ only by the four control names and asset hashes. The generated RSS contains all eight published blog posts. Refs wailsapp#6344. --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: taliesin-ai <taliesin-ai@users.noreply.github.com> Co-authored-by: Lea Anthony <lea.anthony@gmail.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: taliesin-ai <281494191+taliesin-ai@users.noreply.github.com>
…release preparation
Set the version to v3.0.0 (version.txt, @wailsio/runtime package.json and lock), add the v3.0.0 changelog entry, reset the unreleased changelog and write the GitHub release notes. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ailsapp#6363) v3/release_notes.md becomes the complete v3.0.0 GitHub release body: everything new in v3, not only the changes since beta.34. It also stops claiming every advisory is fixed: GHSA-2p5f-2gx8-mh8m is partly fixed, with the open cases listed under Known limitations. Also correct the nightly cron comment, which still described nightlies as patch bumps. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…l v3.0.0 release notes and correct the advisory claim
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. 🗂️ Base branches to auto review: 1
Please check the settings in the CodeRabbit UI or the
|
theodorsm
force-pushed
the
merge/v3.0.0
branch
from
October 26, 2026 14:16
6fae88e to
56efbca
Compare
lixmal
approved these changes
Oct 26, 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.
Updates integration from v3.0.0-beta.25 to upstream v3.0.0
The release contains security fixes and will provide a more stable experience for us following the non-beta releases.