Skip to content

Merge wails v3.0.0 release into integration - #7

Merged
mlsmaycon merged 139 commits into
netbirdio:integrationfrom
theodorsm:merge/v3.0.0
Oct 26, 2026
Merged

mlsmaycon merged 139 commits into
netbirdio:integrationfrom
theodorsm:merge/v3.0.0

Conversation

@theodorsm

Copy link
Copy Markdown
Member

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.

github-actions Bot and others added 30 commits September 24, 2026 00:27
* 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.
… 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>
Fixes wailsapp#6223.

Co-authored-by: taliesin-ai <281494191+taliesin-ai@users.noreply.github.com>
github-actions Bot and others added 24 commits October 19, 2026 15:13
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>
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

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude Code Review

This pull request is from a fork — automated review is disabled. A repository maintainer can comment @claude review to run a one-time review.

@coderabbitai

coderabbitai Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

🗂️ Base branches to auto review: 1
  • master

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@mlsmaycon
mlsmaycon merged commit 2b40023 into netbirdio:integration Oct 26, 2026
11 of 14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.