Changelog

What shipped to Girl and LuaXE

Every deploy that changes Girl or LuaXE is a patch release. A minor release gathers the patches since the last one into a single set of notes. Girl writes the notes from the commits that shipped.

  1. LuaXE 1.1.1

    · Patch

    Relaunched runs no longer open a console window from console-less launchers

    This patch release fixes one relaunch bug in the lxe runtime. When lxe relaunches a run from a launcher that has no console, the new run now starts without a window.

    1 change

    • Fixed lxe When lxe relaunches a run and the launcher has no console, the relaunched run now starts windowless instead of opening a console window.
    Summarized by Girl · claude-opus-5-5 · 1 commit
  2. LuaXE 1.1.0

    fs 2, the process module and a built-in event loop

    LuaXE gains a built-in event loop, fs 2.x with Node's names and nil, err results, and new process, stream, util and events modules, while osal 2.0.0 hands its process functions to the process module.

    47 changes

    • Breaking fs fs calls return nil, err instead of raising errors, and calls without a result return true; this covers sync calls, await, cwd, chdir, watch, configure and Dir. Check return values where you relied on pcall. Argument errors still raise.
    • Breaking fs fs 2.0.0 uses Node's exact names everywhere: functions, option keys, Stats and Dirent fields, Buffer and streams. Rename your calls, for example read_file_sync to readFileSync, following MIGRATING-2.0.md.
    • Breaking fs fs 2.1.0 runs on lxe's event loop with lxe's own Promise, and its streams follow Node v23. Replace isPromise with util.types.isPromise and isPending with p:poll() == 'pending', as MIGRATING-2.1.md explains.
    • Breaking osal osal 2.0.0 moves its process functions and spawn pipe functions to the process module, and the old names now raise an error. Switch to the process module using the mapping in osal's README.
    • New lxe lxe has a built-in event loop that runs implicitly after your script and follows Node's rules for timers, liveness, promises and errors. Hosts that stop threads can take lock ownership of the loop, abandon it and stop it.
    • New process process.fork starts an lxe child with a JSON IPC channel (send, disconnect, connected and message events in Node's order). Spawn's orphan option runs a child that outlives its parent, and the child checks that the channel really comes from its parent.
    • New process The process module 1.0.0 brings Node's child_process to lxe. The Sync forms follow Node's maxBuffer, input and encoding rules, and asynchronous spawn and exec run on the lxe event loop with Node's defaults and error classes.
    • New process process provides a Node-style process object: pid, ppid, platform, arch, argv, execPath, a live env, exit and exitCode, hrtime, memory and CPU usage, standard streams and signal handling.
    • New process process adds containment and execa-style options: contain kills a child's whole tree at close, kill, timeout or script end. Also new are closeGraceMs, forceKillAfterDelay, extendEnv, onMaxBuffer truncation, console = 'new', a check-first killTree and processes().
    • New fs fs is a native module with Node's API on Windows and Linux: synchronous calls, an asynchronous engine with promises, FileHandle and Dir objects, and file watchers.
    • New fs fs adds cp with cycle detection, glob, read and write streams, line reading and openAsBlob (promise only).
    • New fs rename can refuse to replace an existing file (noReplace), atomically on Windows and Linux, with a documented fallback on Linux.
    • New fs open takes a share option ('all', 'read_write', 'read' or 'none') that sets the Windows share mode, so an open file can be protected from deletion; Linux ignores the option.
    • New fs rename takes { writeThrough = true } to flush the rename to disk: MOVEFILE_WRITE_THROUGH on Windows, an fsync of both directories on POSIX.
    • New fs fs adds lockDir, lockDirSync and promises.lockDir for directory locks. On POSIX only the owner releases a lock, and exactly one process takes over a stale one.
    • New osal osal can signal socket readiness on your own event: socket_watch takes an event and socket_events reports what happened. It uses WSAEventSelect on Windows and an edge-triggered epoll poller on Linux.
    • New osal osal adds console_write_input, key_down and handle_count.
    • New osal event_os_handle returns an osal event's raw Windows handle for modules that take one, such as network.
    • New osal osal adds job memory limits and job_assign_current, which puts the current process into a job.
    • New osal osal 1.3.0 adds Windows-parity functions, so Girl no longer needs its own win32 module.
    • New osal osal adds shell_open and launching detached processes.
    • New events events 2.0 provides Node's EventEmitter, matching Node 23.
    • New stream The stream module 1.0 provides Node's Readable, Writable, Duplex, Transform and PassThrough, with pipeline and finished. pipe() never ends process stdout or stderr.
    • New util The util module 1.0.0 provides Node's promisify (with custom), callbackify, format, inspect, deprecate, isDeepStrictEqual, inherits and types.
    • Improved lxe lxe's C API trigger, source and close calls never throw across the C boundary. Programs set their exit status through a new exit status and identity API, and finalizers run when a Lua state closes, with JIT code flushed.
    • Improved lxe lxe's base Lua state includes the standard io and os libraries again.
    • Improved process process requires fs 2.1, reports errors as fs error objects and accepts fs file descriptors as stdio entries.
    • Improved fs The fs README is self-contained, covering options and results, descriptor I/O, classes and migrating from lfs. Build and test notes live in BUILDING.md.
    • Improved fs Reading a whole regular file reads its exact size without zero-filling or regrowing the buffer, and synchronous reads reuse a per-thread buffer.
    • Improved fs fs error objects can be concatenated and take string methods like a string.
    • Improved fs fs checks its option tables strictly.
    • Improved events events 2.0.1 keeps the 1.x box API beside EventEmitter: the 20 named listener boxes, list, delay and new(string), loaded lazily on first use. Published 1.x users such as gui and html keep working.
    • Improved docs The docs module 1.1.0 reads files through fs 2.x instead of io, os and lfs. Its lfs option becomes fs, and the old lfs option is still accepted and ignored.
    • Fixed lxe An uncaught error that is not a string prints through its __tostring, or its type name, instead of an empty message.
    • Fixed fs Reading a directory through Dir no longer drops entries at batch boundaries.
    • Fixed fs A promise's catch, or next with only an error handler, no longer runs the error handler when the promise is fulfilled.
    • Fixed osal wait_any honours its timeout.
    • Fixed osal On POSIX, a socket whose connect failed no longer reports write or read readiness afterwards.
    • Fixed osal On Windows, create_directory with parents = true stops at the root instead of crashing.
    • Fixed osal spawn records a child's native handles from creation and reaps the child if recording fails, so a kill in the middle of a spawn leaks no process or handle.
    • Fixed osal On POSIX, osal reports permission_denied for a launcher that exists but is not executable.
    • Fixed osal Two Linux defects are fixed: the argument encoder receives the packed object, and portable sources include the headers they need.
    • Fixed memory The memory 2.0.2 module's submodules load from an installed module store; before, they required source-checkout paths.
    • Fixed stream stream 1.0.1 reuses an already loaded events 2.x instead of importing a second copy, so streams share one EventEmitter class with other modules.
    3 internal changes
    • Internal tests Tests: module suites run on an lxe without file io, child-process tests get timeouts and real exit codes, and osal's parity and fixture tests are reworked.
    • Internal build Build: osal's build-matrix gate compiles both backends on every change and fails closed, lower CMake and C++ minimums are tested, a VERSION file names the published version, and process's build notes name the required lxe.
    • Internal docs Design documents for the event loop, the process API and the Node-parity fs API are added and updated.