v2.0.0-beta.4
Pre-release
Pre-release
GTKX 2.0 beta 4 closes the remaining regressions found after beta 3. It hardens headless process cleanup and concurrent codegen recovery, makes gtkx dev follow the complete configuration graph, improves generated typings and reference documentation, and tightens deployment, testing, and project-creation behavior.
GTKX 2.0 beta 4 is a prerelease. The final GTKX 2.0 release is scheduled for December 1, 2026, after the migration and hardening period.
Project Creation and Development
create-gtkxno longer creates or ownsmise.toml; mise remains a monorepo convenience, and an existing user file is preserved even with--overwrite.- Existing destinations now list scaffold-owned files before and after replacement, unknown command-line flags fail instead of being ignored, and the guide and tutorial match the prompt order.
gtkx dev --configwatches the selected configuration's complete local dependency graph, including imports, package import aliases, c12extendslayers, data files, missing dependencies that later appear, and dependencies that change after a reload. Reload messages name the selected config file, and config-not-found errors name both the searched pattern or requested file and working directory.- A translation extraction error during a development restart now keeps the previous POT and generated declarations, reports the concise source error, and leaves the dev session running. Babel parse errors no longer repeat the absolute filename.
Headless Development and Testing
- Headless Vitest workers now watch their launching process as well as their own worker lifecycle, so hard-killing Vitest tears down the worker, compositor, session bus, guards, and private runtime directory.
- The parent-death supervisor verifies process identities before reacting to
SIGCONT, kills the process group before removing its runtime directory, and closes fork and cleanup races without allowing unrelated or reused processes and paths to be touched. - GTKX reaps verified, user-owned stale
gtkx-xdg-*runtimes automatically whengtkx devor the Vitest plugin starts.gtkx cleanupperforms the same cleanup explicitly, andgtkx cleanup --dry-runlists candidates without removing them.
Code Generation and Reference
- Generated-store recovery now identifies dead and reused writer PIDs, removes abandoned staging, legacy, detached, incomplete pair, and excess complete generations, protects live writers and active readers, and keeps only complete generations in the retention allowance. Clean runs remove
.codegen.lock, while unsafe symlink and hard-link lock files receive the same GTKX diagnostic. The configuration guide documents the store layout, three-generation retention rule, andGTKX_CODEGEN_LOCK_TIMEOUT_MS. - Generated subclasses with narrowed inherited instance or static methods retain their natural signatures without exposing
this: nevertombstone overloads. Invalid inherited calls toGObject.Object.newvnow throw a JavaScript error directing callers to the subclass'snew(...)factory. - Callback-only async methods whose finish function belongs to another class now carry a generated note naming the external owner and completion method, with a wrapper recipe in the async guide.
- Element reference pages include GIR constructors alongside static methods and strip C-only allocation,
free, andunrefinstructions that do not apply to JavaScript. libraries.jsonnow contains only the generated GIR library identifiers; the unused, incompleteversionsand redundantgirVersionsmaps are removed.
React and Testing
- Generated widget classes that narrow inherited methods remain usable across
@gtkx/react,@gtkx/forms,@gtkx/animated, and@gtkx/testing. Type-filtered queries preserve the requested widget class, while containers, matchers, events, screenshots, removal waits, anduserEventaccept the generated accessible surface and still reject non-widget targets at runtime. renderaccepts affected widget-backed containers such asAdw.PreferencesPage, and the testing guide now explains thatrootElementis only for trees that create a top-level window; loose widget fragments should use the harness.- The session-service testing example now uses the typed
Gio.DBusInterfaceMethodCallFuncparameters instead of positional casts.
Build, Deployment, and MCP
- Build-output refusals now identify whether the path is outside the project, crosses a symlink, is nested in or contains another GTKX build, is nonempty and unmanaged, or is not a directory.
- Deployment warns when an
extraFilesdestination is overridden by GTKX-generated desktop, metainfo, or MIME metadata. AppStreamunknown-tagfailures now recommend removing the unsupported element or using<custom>, and the guide correctly records that this rule is fatal for every target. - Generated deployment typings document that
extraFiles.moderejects setuid and setgid bits and that downloaded Node runtimes default to exactly 26.7.0. Hoisted generated-store errors now advise installing GTKX packages locally or moving the project outside the ancestor dependency tree. gtkx_list_appsnow states that it returns the current snapshot immediately unlesswaitForAppsis enabled.
Previously Shipped Beta Fixes
The following improvements shipped in beta 2 or beta 3 but were omitted from their release notes:
- GIR parsing preserves illegal XML control characters found in string constants instead of rejecting or corrupting them.
- Debian and RPM manifests avoid claiming additional filesystem-owned systemd, libexec, system D-Bus, and polkit directories.
- The async guide documents
keepAlivefor non-application helper processes, and the testing guide explains how to fake services missing from each worker's private session bus. - The configuration guide explains why generated stores must share the project's dependency tree and how to resolve an ancestor or hoisted
@gtkx/*installation. - The generated
Adw.Applicationreference explains that GTKX does not loadshortcuts-dialog.uiautomatically and links to the JSX action, accelerator, and dialog pattern.
(#616)
Full changelog: v2.0.0-beta.3...v2.0.0-beta.4