Skip to content

Version Packages - #41

Merged
zsy-jason merged 1 commit into
mainfrom
changeset-release/main
Aug 3, 2026
Merged

Version Packages#41
zsy-jason merged 1 commit into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actions github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@lynxtron-examples/config@0.0.5

Patch Changes

  • dd950b6: Add the electron-fiddles showcase β€” the complete Electron docs/fiddles set
    ported to Lynxtron (55 fiddles: 37 working, 7 partial, 11 N/A) β€” and surface it
    as a dedicated "Electron Fiddles" section in the Lynxtron GO gallery.

    It follows upstream's own model rather than inventing one. Upstream's
    docs/fiddles holds 171 files and zero package.jsons: each fiddle is a plain
    source folder, and Electron Fiddle synthesizes a throwaway project around it at
    run time and spawns Electron on that. Here each fiddle is likewise a loose
    source folder laid out at its upstream path, and scripts/assemble.mjs turns one
    into a complete standalone Lynxtron project, compiles it, and runs it β€” with the
    one extra step Electron does not need, since Lynx cannot load source at run time.

    Because every fiddle is its own project, launching one from the gallery spawns
    its own Lynxtron process. That isolation is load-bearing: while all fiddles
    shared a single main process, the ones touching app-global state
    (Menu.setApplicationMenu, app.dock.setMenu,
    app.setAsDefaultProtocolClient) silently overwrote each other.

    • kit/ (@lynxtron-examples/fiddle-kit): the shared bridge helpers, Lynx UI
      kit, and runtime access to native classes the ESM shim omits. It ships inside
      the showcase as a file: dependency rather than as an independently released
      workspace package β€” a fetched showcase has no monorepo to resolve
      workspace:* against, and the kit is private so it cannot be published.
    • config: createShowcaseConfig gains server (and entries, for multi-entry
      showcases).
    • lynxtron-go: the gallery bakes in the fiddle catalog and lists all 55 fiddles
      grouped by upstream category with status badges, separate from the
      featured-showcase grid.

    The fiddles are pared back to the API demonstration itself and share the repo's
    Fiddle Dark language with showcases/counter and showcases/system-monitor β€”
    palette from @lynxtron-examples/config/tokens.css, labelled panels, and
    var(--font-mono) reserved for data. partial fiddles keep one plain line
    naming the gap; the tutorial prose that repeated the port matrix is gone.

    Each fiddle also lists the Lynxtron APIs it calls, in monospace, and tapping one
    opens its page in the published API reference. The lists are derived from each
    fiddle's own source rather than hand-written.

@lynxtron-examples/benchmark@0.0.4

Patch Changes

  • 28c3775: Migrate every showcase from the deprecated per-window win.on('-lynx-invoke')
    and win.on('-lynx-message') listeners to the process-global lynxBridge.handle()
    and lynxBridge.on() API.

    Each showcase's dispatch switch is split into per-method handlers, and
    registration is hoisted to app.whenReady() so windows that reopen (e.g. the
    gallery's activate handler, the benchmark's second window) do not
    re-register the same handler.

@lynxtron-examples/floating-clock@0.0.4

Patch Changes

  • 28c3775: Migrate every showcase from the deprecated per-window win.on('-lynx-invoke')
    and win.on('-lynx-message') listeners to the process-global lynxBridge.handle()
    and lynxBridge.on() API.

    Each showcase's dispatch switch is split into per-method handlers, and
    registration is hoisted to app.whenReady() so windows that reopen (e.g. the
    gallery's activate handler, the benchmark's second window) do not
    re-register the same handler.

@lynxtron-examples/system-monitor@0.0.4

Patch Changes

  • 28c3775: Migrate every showcase from the deprecated per-window win.on('-lynx-invoke')
    and win.on('-lynx-message') listeners to the process-global lynxBridge.handle()
    and lynxBridge.on() API.

    Each showcase's dispatch switch is split into per-method handlers, and
    registration is hoisted to app.whenReady() so windows that reopen (e.g. the
    gallery's activate handler, the benchmark's second window) do not
    re-register the same handler.

@lynxtron-examples/todolist@0.0.5

Patch Changes

  • 28c3775: Migrate every showcase from the deprecated per-window win.on('-lynx-invoke')
    and win.on('-lynx-message') listeners to the process-global lynxBridge.handle()
    and lynxBridge.on() API.

    Each showcase's dispatch switch is split into per-method handlers, and
    registration is hoisted to app.whenReady() so windows that reopen (e.g. the
    gallery's activate handler, the benchmark's second window) do not
    re-register the same handler.

lynxtron-go@0.1.0

Minor Changes

  • dd950b6: Add the electron-fiddles showcase β€” the complete Electron docs/fiddles set
    ported to Lynxtron (55 fiddles: 37 working, 7 partial, 11 N/A) β€” and surface it
    as a dedicated "Electron Fiddles" section in the Lynxtron GO gallery.

    It follows upstream's own model rather than inventing one. Upstream's
    docs/fiddles holds 171 files and zero package.jsons: each fiddle is a plain
    source folder, and Electron Fiddle synthesizes a throwaway project around it at
    run time and spawns Electron on that. Here each fiddle is likewise a loose
    source folder laid out at its upstream path, and scripts/assemble.mjs turns one
    into a complete standalone Lynxtron project, compiles it, and runs it β€” with the
    one extra step Electron does not need, since Lynx cannot load source at run time.

    Because every fiddle is its own project, launching one from the gallery spawns
    its own Lynxtron process. That isolation is load-bearing: while all fiddles
    shared a single main process, the ones touching app-global state
    (Menu.setApplicationMenu, app.dock.setMenu,
    app.setAsDefaultProtocolClient) silently overwrote each other.

    • kit/ (@lynxtron-examples/fiddle-kit): the shared bridge helpers, Lynx UI
      kit, and runtime access to native classes the ESM shim omits. It ships inside
      the showcase as a file: dependency rather than as an independently released
      workspace package β€” a fetched showcase has no monorepo to resolve
      workspace:* against, and the kit is private so it cannot be published.
    • config: createShowcaseConfig gains server (and entries, for multi-entry
      showcases).
    • lynxtron-go: the gallery bakes in the fiddle catalog and lists all 55 fiddles
      grouped by upstream category with status badges, separate from the
      featured-showcase grid.

    The fiddles are pared back to the API demonstration itself and share the repo's
    Fiddle Dark language with showcases/counter and showcases/system-monitor β€”
    palette from @lynxtron-examples/config/tokens.css, labelled panels, and
    var(--font-mono) reserved for data. partial fiddles keep one plain line
    naming the gap; the tutorial prose that repeated the port matrix is gone.

    Each fiddle also lists the Lynxtron APIs it calls, in monospace, and tapping one
    opens its page in the published API reference. The lists are derived from each
    fiddle's own source rather than hand-written.

Patch Changes

  • dd950b6: Fix the fetch β†’ install β†’ build β†’ run chain for showcases opened from the
    gallery, and make gallery thumbnails render again.

    Four separate failures, each of which made a fetched showcase unrunnable:

    • pnpm aborted on a TTY prompt. Installs are spawned by the app, never from
      a terminal, so pnpm's "remove node_modules?" confirmation had nothing to
      answer it and bailed with ERR_PNPM_ABORTED_REMOVE_MODULES_DIR_NO_TTY. The
      install environment now declares itself non-interactive.
    • The workspace ran whatever pnpm the machine had. ~/.lynxtron-go pinned
      no packageManager, so on a machine with pnpm 11 it used that β€” and pnpm 11
      no longer reads pnpm.onlyBuiltDependencies from package.json and turns
      ignored build scripts into a hard error. @lynx-js/lynxtron's postinstall
      downloads the runtime binary, so the install "succeeded" with no runtime.
      The workspace now pins the same pnpm as the monorepo, and declares
      onlyBuiltDependencies in pnpm-workspace.yaml as well (here and in the
      monorepo) so either pnpm major works.
    • @lynx-js/lynxtron-builder's postinstall patches app-builder-lib and
      dmg-builder
      , which pnpm does not hoist. The monorepo carries both at its
      root for exactly this reason; the synthesized workspace now does too.
    • Gallery thumbnails were blank in remote mode. Lynx's <image> loader
      reads the URL itself rather than going through the window's fetch handler, and
      does not load https at all β€” the URL answered 200 and the image still never
      appeared. Thumbnails are now staged into the app's own bundle and referenced
      as local files, which also leaves a packaged build self-contained.
  • 965289b: Three fixes found while testing the IDE surface.

    The palette opened behind the code. Native Scintilla views paint above all
    Lynx UI whatever the z-index says, so an overlay does not cover the editor β€” the
    editor covers the overlay. The Fiddle has handled this since it grew dialogs
    (App passes overlayActive and it detaches its editors); the IDE's single
    editor had no equivalent, so on that surface only the palette's footer showed
    below the editor's bottom edge. It now detaches while the palette or gallery is
    open, and re-attaches after β€” re-attach only, since re-pushing the text would
    also jump the caret to line 0.

    One resolver, and reuse what is already on disk. The Fiddle and the IDE are
    two views of one workspace, but each carried its own copy of "local source tree,
    else fetch" β€” two functions meaning the same thing, free to drift, sharing every
    failure anyway. They now share one, which also gained the step both were
    missing: fetch wipes and re-extracts its destination on every call, so opening
    a showcase in the Fiddle and then in the IDE downloaded and installed the same
    workspace twice, seconds apart. A materialized workspace is now reused, verified
    by reading its manifest so a half-extracted directory from an interrupted fetch
    is not mistaken for a usable one.

    A failed workspace says so. A window opened to prepare a showcase that never
    arrived showed the same "Open Folder" invitation as an idle one; the reason sat
    in the Output panel, which is closed by default. The editor area now names the
    failure and offers Try again.

  • 09c97f2: Make Cmd+P actually search the workspace, add Cmd+K, and restyle the palette to
    the app's own design language with keyboard navigation.

    Cmd+P could not really search files. Its pool was the sidebar's model:
    openFolder loads the root's direct children, and a directory's contents load
    only when the user expands it. A showcase keeps its source under src/, which
    is collapsed on open β€” so App.tsx, index.tsx and everything else real was
    invisible, and only the handful of root-level files were findable. The palette
    now indexes the workspace itself, walking it breadth-first a few directories per
    tick so the synchronous filesystem bridge does not stall the UI. With a full
    index, ordering matters: matches rank name-exact > name-prefix > name-substring

    path-substring, and the list is capped at 200 rows.

    Cmd+K opens the same palette with > already typed β€” literally "Cmd+P then
    type >". The mode still derives from the prefix, so backspacing the > falls
    back to file search exactly as it does when typed by hand.

    It was the last surface still painted in hardcoded VS Code greys (#252526,
    #3c3c3c, #007aff), so it read as a different product from the Fiddle home
    and the showcase gallery beside it. It now uses the theme variables the rest of
    the app uses, which also means it follows the light theme instead of ignoring it.

    • Keyboard navigation, modelled on cmdk: ↑/↓ move the selection and wrap
      at the ends, Home/End jump, Enter activates the selected row rather
      than always the first, and Esc closes. The selection is tracked by row key,
      not index, so narrowing the query keeps the same row selected instead of
      sliding the highlight onto whatever now sits in that position. Hover moves it
      too, so pointer and keyboard never disagree.
    • Layering. The overlay had no z-index at all and could fall behind the
      gallery overlay (300) and the Fiddle's dialogs (100/200). It is now 400.
      z-index alone is not sufficient against the native Scintilla editors, which
      paint above all Lynx UI β€” that was already handled, since App.tsx passes
      overlayActive while the palette is open so the Fiddle detaches them.
    • Rows are padded rather than a fixed 44px; a showcase row carries a name, a
      description and tags, and the fixed height clipped them.
    • Monospace only for data β€” paths and accelerators, not showcase prose.
      Accelerators moved to a trailing key chip, the way a real menu shows them.
  • 0136cc3: Quick Open now opens files in the product you are looking at.

    The palette was born with the IDE, and its file rows always went to
    openFile β€” which writes App-level editor tabs that only the IDE renders. On
    the Fiddle surface, which is where the app starts and where the gallery's Open
    lands you, picking a file wrote it into state nothing displayed. Cmd+P looked
    broken there because half of it was.

    The palette stays App-level, since it has to float above both products, but its
    rows now come from whichever product is mounted:

    • Fiddle surface β€” the fiddle's own editors. Activating one calls the same
      selectEditor a sidebar click does, so a hidden file is revealed and focused
      rather than silently selected.
    • Workspace surface β€” the indexed file tree, opening into IDE tabs as
      before.

    Cmd+K is unaffected: commands are global and worked on both surfaces already.

    Also fixes the row path rendering. It was fullPath.replace(rootPath + '/', ''), and a string argument to replace substitutes the first match
    anywhere β€” with no workspace root the pattern was just /, so
    src/app/App.tsx rendered as srcapp/App.tsx.

  • c238495: Make the window show one product at a time, and make the menu reach it.

    The app hosts two products β€” the Fiddle and the IDE workspace β€” but which one
    you saw was the product of two independent booleans, and the menu was
    hardwired to one of them. Nothing reconciled the two.

    • One surface. The visible product was legacyIdeOpen && route.kind === 'workspace': two flags for one mutually exclusive state, which made
      "workspace route, flag off" representable. In that state files opened into
      tabs nothing rendered, and Quick Open searched a workspace you thought you
      had left. It was reachable from the gallery: opening a fiddle while in a
      workspace cleared the flag but left the route. The surface is now derived
      from the route alone, so the state cannot be expressed.

    • The menu follows the surface. fiddle:* events are handled by
      Fiddle.tsx and ide:* by App.tsx, and only one of the two is mounted. Since
      the Fiddle port rewrote the menu around fiddle:*, every IDE accelerator had
      been sending to an unmounted component: Cmd+S, Cmd+W, Cmd+O, Cmd+F,
      Cmd+Shift+F and Cmd+J all did nothing in the IDE workspace
      , and App.tsx's
      six matching listeners had no sender at all. The renderer now reports its
      surface and the menu is rebuilt for it, so each accelerator reaches the
      product that is actually mounted.

    • Each surface gets its own menu. The workspace surface no longer shows
      New Fiddle, Run Fiddle, Stop Fiddle or Publish to Gist β€” none of which it can
      do β€” and gains Open Folder…, Close Tab, Find, Find in Files and Toggle Panel.
      The Fiddle surface is unchanged. Cmd+P and Cmd+K exist on both.

      Cmd+O in particular was not merely dead in the IDE: on the Fiddle surface it
      feeds the chosen folder to loadLocalFiddle, which rejects anything that is
      not already fiddle-shaped, so File β–Έ Open could not open an ordinary project
      at all. The workspace surface now routes it to the IDE's own folder dialog.

  • Updated dependencies [dd950b6]

  • Updated dependencies [0e3d212]

    • @lynxtron-examples/cli@0.0.5

@lynxtron-examples/electron-fiddles@0.1.0

Minor Changes

  • dd950b6: Add the electron-fiddles showcase β€” the complete Electron docs/fiddles set
    ported to Lynxtron (55 fiddles: 37 working, 7 partial, 11 N/A) β€” and surface it
    as a dedicated "Electron Fiddles" section in the Lynxtron GO gallery.

    It follows upstream's own model rather than inventing one. Upstream's
    docs/fiddles holds 171 files and zero package.jsons: each fiddle is a plain
    source folder, and Electron Fiddle synthesizes a throwaway project around it at
    run time and spawns Electron on that. Here each fiddle is likewise a loose
    source folder laid out at its upstream path, and scripts/assemble.mjs turns one
    into a complete standalone Lynxtron project, compiles it, and runs it β€” with the
    one extra step Electron does not need, since Lynx cannot load source at run time.

    Because every fiddle is its own project, launching one from the gallery spawns
    its own Lynxtron process. That isolation is load-bearing: while all fiddles
    shared a single main process, the ones touching app-global state
    (Menu.setApplicationMenu, app.dock.setMenu,
    app.setAsDefaultProtocolClient) silently overwrote each other.

    • kit/ (@lynxtron-examples/fiddle-kit): the shared bridge helpers, Lynx UI
      kit, and runtime access to native classes the ESM shim omits. It ships inside
      the showcase as a file: dependency rather than as an independently released
      workspace package β€” a fetched showcase has no monorepo to resolve
      workspace:* against, and the kit is private so it cannot be published.
    • config: createShowcaseConfig gains server (and entries, for multi-entry
      showcases).
    • lynxtron-go: the gallery bakes in the fiddle catalog and lists all 55 fiddles
      grouped by upstream category with status badges, separate from the
      featured-showcase grid.

    The fiddles are pared back to the API demonstration itself and share the repo's
    Fiddle Dark language with showcases/counter and showcases/system-monitor β€”
    palette from @lynxtron-examples/config/tokens.css, labelled panels, and
    var(--font-mono) reserved for data. partial fiddles keep one plain line
    naming the gap; the tutorial prose that repeated the port matrix is gone.

    Each fiddle also lists the Lynxtron APIs it calls, in monospace, and tapping one
    opens its page in the published API reference. The lists are derived from each
    fiddle's own source rather than hand-written.

Patch Changes

  • 28c3775: Migrate every showcase from the deprecated per-window win.on('-lynx-invoke')
    and win.on('-lynx-message') listeners to the process-global lynxBridge.handle()
    and lynxBridge.on() API.

    Each showcase's dispatch switch is split into per-method handlers, and
    registration is hoisted to app.whenReady() so windows that reopen (e.g. the
    gallery's activate handler, the benchmark's second window) do not
    re-register the same handler.

@lynxtron-examples/cli@0.0.5

Patch Changes

  • dd950b6: Fix the fetch β†’ install β†’ build β†’ run chain for showcases opened from the
    gallery, and make gallery thumbnails render again.

    Four separate failures, each of which made a fetched showcase unrunnable:

    • pnpm aborted on a TTY prompt. Installs are spawned by the app, never from
      a terminal, so pnpm's "remove node_modules?" confirmation had nothing to
      answer it and bailed with ERR_PNPM_ABORTED_REMOVE_MODULES_DIR_NO_TTY. The
      install environment now declares itself non-interactive.
    • The workspace ran whatever pnpm the machine had. ~/.lynxtron-go pinned
      no packageManager, so on a machine with pnpm 11 it used that β€” and pnpm 11
      no longer reads pnpm.onlyBuiltDependencies from package.json and turns
      ignored build scripts into a hard error. @lynx-js/lynxtron's postinstall
      downloads the runtime binary, so the install "succeeded" with no runtime.
      The workspace now pins the same pnpm as the monorepo, and declares
      onlyBuiltDependencies in pnpm-workspace.yaml as well (here and in the
      monorepo) so either pnpm major works.
    • @lynx-js/lynxtron-builder's postinstall patches app-builder-lib and
      dmg-builder
      , which pnpm does not hoist. The monorepo carries both at its
      root for exactly this reason; the synthesized workspace now does too.
    • Gallery thumbnails were blank in remote mode. Lynx's <image> loader
      reads the URL itself rather than going through the window's fetch handler, and
      does not load https at all β€” the URL answered 200 and the image still never
      appeared. Thumbnails are now staged into the app's own bundle and referenced
      as local files, which also leaves a packaged build self-contained.
  • 0e3d212: Make a fetched showcase actually install and build.

    Two independent faults in the synthesized workspace under ~/.lynxtron-go
    stopped every remote showcase β€” in the Fiddle and the IDE alike β€” before it
    could run.

    The lockfile was frozen against manifests that move. Every install the CLI
    spawns runs with CI=true, set so pnpm would not stop on an interactive purge
    prompt with no TTY. That flag carries a second meaning: pnpm also defaults
    frozen-lockfile to true in CI. The workspace's manifests are rewritten from
    the current catalog on every fetch, while its lockfile is a cache left by the
    previous one, so any catalog move made the next fetch die with
    ERR_PNPM_OUTDATED_LOCKFILE before installing anything. That is the inverse of
    a repo CI install β€” there the lockfile is the source of truth and must not
    drift, here it is a cache that has to follow the manifests. All three install
    sites now pass --no-frozen-lockfile. It has to be the flag: pnpm does not read
    npm_config_frozen_lockfile from the environment (checked against pnpm
    10.15.1).

    Two toolchains coexisted in one tree. The root pins
    @lynxtron-examples/config to latest, and a published config carries hard
    dependency ranges frozen at whatever the catalog was when it shipped. With the
    catalog ahead of the last publish, pnpm satisfied both: the new toolchain at the
    root, a nested old one under config β€” and the showcase's build resolved its
    plugin through config. Old plugin against new React is a crash, not a warning:

    TypeError: Cannot read properties of undefined (reading 'entries')
      at @lynx-js/react-rsbuild-plugin/dist/208.js
    

    The synthesized workspace is ours end to end, so there is one right version of
    each toolchain package β€” the one the showcase was built against. It is now
    declared as pnpm.overrides, which holds however far behind the published
    config drifts.

@lynxtron-examples/counter@0.0.2

Patch Changes

  • 28c3775: Migrate every showcase from the deprecated per-window win.on('-lynx-invoke')
    and win.on('-lynx-message') listeners to the process-global lynxBridge.handle()
    and lynxBridge.on() API.

    Each showcase's dispatch switch is split into per-method handlers, and
    registration is hoisted to app.whenReady() so windows that reopen (e.g. the
    gallery's activate handler, the benchmark's second window) do not
    re-register the same handler.

@zsy-jason
zsy-jason merged commit d8ade83 into main Aug 3, 2026
1 check 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.

1 participant