Skip to content

v2.0.0-beta.4

Pre-release
Pre-release

Choose a tag to compare

@eugeniodepalo eugeniodepalo released this 04 Sep 19:15
dadaa2d

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-gtkx no longer creates or owns mise.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 --config watches the selected configuration's complete local dependency graph, including imports, package import aliases, c12 extends layers, 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 when gtkx dev or the Vitest plugin starts. gtkx cleanup performs the same cleanup explicitly, and gtkx cleanup --dry-run lists 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, and GTKX_CODEGEN_LOCK_TIMEOUT_MS.
  • Generated subclasses with narrowed inherited instance or static methods retain their natural signatures without exposing this: never tombstone overloads. Invalid inherited calls to GObject.Object.newv now throw a JavaScript error directing callers to the subclass's new(...) 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, and unref instructions that do not apply to JavaScript.
  • libraries.json now contains only the generated GIR library identifiers; the unused, incomplete versions and redundant girVersions maps 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, and userEvent accept the generated accessible surface and still reject non-widget targets at runtime.
  • render accepts affected widget-backed containers such as Adw.PreferencesPage, and the testing guide now explains that rootElement is 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.DBusInterfaceMethodCallFunc parameters 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 extraFiles destination is overridden by GTKX-generated desktop, metainfo, or MIME metadata. AppStream unknown-tag failures 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.mode rejects 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_apps now states that it returns the current snapshot immediately unless waitForApps is 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 keepAlive for 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.Application reference explains that GTKX does not load shortcuts-dialog.ui automatically and links to the JSX action, accelerator, and dialog pattern.

(#616)

Full changelog: v2.0.0-beta.3...v2.0.0-beta.4