From 5e06696fc958754c6f1b8c74e7a9788200943428 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 3 Sep 2026 08:19:17 +0000
Subject: [PATCH] Version Packages
---
.tegami/2026-08-23-d5a83f.md | 14 -----
.tegami/2026-08-24-4e91cb.md | 21 -------
.tegami/2026-09-03-7b3e41.md | 56 -------------------
.tegami/2026-09-03-9c1f2a.md | 20 -------
.tegami/publish-lock.yaml | 24 +++-----
packages/create/package.json | 2 +-
.../create/scaffold/Packages/manifest.json | 4 +-
packages/create/scaffold/react/package.json | 4 +-
packages/material/package.json | 2 +-
packages/renderer/CHANGELOG.md | 54 ++++++++++++++++++
packages/renderer/package.json | 2 +-
packages/scripts/package.json | 2 +-
unity/clearscript/package.json | 2 +-
unity/core/package.json | 2 +-
unity/jint/package.json | 2 +-
unity/quickjs/package.json | 2 +-
16 files changed, 74 insertions(+), 139 deletions(-)
delete mode 100644 .tegami/2026-08-23-d5a83f.md
delete mode 100644 .tegami/2026-08-24-4e91cb.md
delete mode 100644 .tegami/2026-09-03-7b3e41.md
delete mode 100644 .tegami/2026-09-03-9c1f2a.md
diff --git a/.tegami/2026-08-23-d5a83f.md b/.tegami/2026-08-23-d5a83f.md
deleted file mode 100644
index bc272558..00000000
--- a/.tegami/2026-08-23-d5a83f.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-packages:
- "upm:com.reactunity.clearscript": patch
----
-
-### ClearScript 7.5.1
-
-Updates the bundled ClearScript binaries from 7.5.0 to 7.5.1, which moves V8 from 13.3.415.23 to 14.7.173.23. All fourteen files — the three managed assemblies with their XML docs and the eight native V8 builds — keep their names between the two releases, so every `.meta` and its GUID carries over and Unity sees a plain reimport rather than fourteen new plugins to configure.
-
-The managed assemblies stay on the `net471` flavour from NuGet, and 7.5.1's dependency floor for that target is unchanged, so the `System.*` and `Microsoft.Bcl.AsyncInterfaces` assemblies alongside them still satisfy it.
-
-Upstream lists one breaking change: the strong-name keypair changed, and hosts must be recompiled. That is a non-event here because `ReactUnity.Runtime` is an asmdef compiled from source in the consuming project, so it re-binds to the new key on import — but it would bite anyone shipping a prebuilt assembly that references ClearScript.
-
-Worth knowing for interop: 7.5.1 applies `HostItemFlags.DirectAccess` to all fully public classes by default. `ClearScriptEngine` leans on `UseCaseInsensitiveMemberBinding`, `UseReflectionBindFallback` and extension methods, which direct access bypasses, so this was the change most likely to regress silently. The EditMode and PlayMode suites both run every fixture a second time under `JavascriptEngineType.ClearScript`, and both are clean, which is the evidence that it did not.
diff --git a/.tegami/2026-08-24-4e91cb.md b/.tegami/2026-08-24-4e91cb.md
deleted file mode 100644
index aacc6bc2..00000000
--- a/.tegami/2026-08-24-4e91cb.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-packages:
- "upm:com.reactunity.quickjs": minor
- "upm:com.reactunity.core": minor
----
-
-### QuickJS is now quickjs-ng, and modules load without blocking a frame
-
-`com.reactunity.quickjs` bound unity-jsb's fork of Bellard-era QuickJS. It now binds [quickjs-ng](https://github.com/quickjs-ng/quickjs). These are two different engines rather than two versions of one, so the native binary, the C shim over it, and every P/Invoke declaration were rebuilt rather than upgraded — the sources are in `native/quickjs` in the repo, which is new: the binaries used to arrive prebuilt from upstream with no way to rebuild them here.
-
-**What you get for it: `import` actually works.** ng has an asynchronous module loader, and the binding now uses it. A module graph is fetched over `UnityWebRequest` while the engine keeps running, so an `import` of an `http` URL — and therefore a dynamic `import()` — resolves without a blocking frame, and a graph whose second hop is only discoverable once the first arrives still completes. `import.meta.url` is populated on a fetched module, which is what the relative imports inside it resolve against. `EngineCapabilities.ModuleResolution` is how you ask whether the engine in front of you can do this.
-
-**WebGL too, which it never could before.** ES module syntax simply did not work on that backend: it has no QuickJS in it, and the JavaScript reimplementation standing in for one evaluates through `eval`, which cannot run `import` or `export` at all. It now fetches a graph through the same loader every other platform uses, then hands the linking to the browser it is already running in — so live bindings, top-level `await` and the module cache come from there. Two things to know. Circular imports are refused rather than resolved, with an error naming the cycle; and the page needs `unsafe-eval` and `blob:` scripts allowed, which is the default, and `unsafe-eval` was already required by `eval`.
-
-**A runaway script now throws instead of killing the process.** quickjs-ng caps how much C stack a script may use, but its 1 MB default is measured against the thread that created the engine — Unity's main thread, which has less than that left — so the guard never fired. Infinite recursion took out the player or the Editor with a `StackOverflowException` that no `catch` could see. The limit now defaults to 768 KB, so the same script raises an ordinary `RangeError` you can catch and log. `ScriptRuntime.MaxStackSize` changes it: raise it for deliberately deep code, lower it on a platform whose main thread has a smaller stack, and note that zero does not mean "no limit" but "use ng's default", which is the unusable one.
-
-**One behaviour change worth checking your code for.** QuickJS used to marshal an empty JavaScript string back to C# as `null`, which made it the one engine that could not represent `''`. It now returns `string.Empty`. If you wrote `?? ""` or a null check around a value that arrives from script, that workaround is no longer needed — and if you branched on `null` to mean "empty", that branch has changed meaning.
-
-**Two features are gone, and neither was reachable.** Operator overloading is not something ng implements, and the machinery for registering it had sat behind a permanently false guard. The editor-side code generator is gone too: it emitted C# bindings to compile at runtime, which the `.NET Standard` profile Unity compiles against excluded anyway, so it could not run in a Unity project at all. Reflection binding, which is what actually binds your types, is untouched.
-
-Verified against an IL2CPP player on Windows x64, not only in the Editor. The Editor is always Mono, so it says nothing about a P/Invoke stub the AOT compiler had to generate or a type the managed stripper deleted — which is most of what this binding is made of.
diff --git a/.tegami/2026-09-03-7b3e41.md b/.tegami/2026-09-03-7b3e41.md
deleted file mode 100644
index 37d84b95..00000000
--- a/.tegami/2026-09-03-7b3e41.md
+++ /dev/null
@@ -1,56 +0,0 @@
----
-packages:
- "npm:@reactunity/renderer": minor
----
-
-### A Vite preset for ReactUnity apps
-
-`@reactunity/renderer/vite` configures Vite the way a ReactUnity app needs it, so a project's whole
-config is:
-
-```ts
-import reactUnity from '@reactunity/renderer/vite';
-import { defineConfig } from 'vite';
-
-export default defineConfig({ plugins: [reactUnity()] });
-```
-
-**Output goes into the Unity project.** The preset walks up from the Vite root looking for an
-`Assets` folder beside a `ProjectSettings/ProjectVersion.txt`, testing each ancestor and one level
-below it, and builds into that project's `Assets/Resources/react`. Both layouts are found: the app
-inside the project, and the app beside it. `unityProject` and `assetPath` say it outright when the
-guess is wrong, and it stays out of the way entirely if the config already sets `build.outDir`.
-
-**The output folder is cleaned, and the `.meta` files survive.** Unity writes a `.meta` beside every
-asset, and the GUID in it is what scenes and prefabs reference — so emptying the folder the way Vite
-would means every rebuild mints new GUIDs and breaks whatever pointed at the old ones. The clean
-deletes the output and leaves the metas, and once the build has written its files it drops only the
-metas whose asset did not come back, along with any directory the build left empty. A build that
-*fails* leaves the metas alone, so the next successful one restores the files under their original
-GUIDs. `preserve` exempts paths the build does not own, and the clean refuses outright to run on a
-directory that is not plausibly build output — a package, a repository, an `Assets` folder, or
-anything containing the Vite root.
-
-For the same reason, output filenames carry no content hash by default: a hash renames the file on
-every build, which costs it its meta. `hashFileNames: true` restores Vite's naming.
-
-**Emitted assets carry their extension twice**, so `index.css` is written as `index.css.css`. Unity
-finds a resource by its path minus the last extension, which makes `assets/index.js` and
-`assets/index.css` the same resource -- and asking for the script could hand back the stylesheet, to
-be run as JavaScript. Doubling puts the type back into the name the lookup uses. Content hashes did
-this by accident before; without them it has to be deliberate.
-
-**Assets are never inlined.** Vite turns a file under 4 kB into a `data:` URI, and Unity loads an
-asset URL through its own loaders — so a small image that got inlined stopped resolving. The limit
-is 0, which is where `react-unity-scripts` had it too.
-
-**CSS is emitted for an old browser.** ReactUnity's CSS subset does not know `oklch()`, `color-mix()`
-or nesting, and a stylesheet that uses them silently loses those declarations. `build.cssTarget`
-defaults to `chrome87`, which is what makes Lightning CSS lower them on the way out — enough that
-Tailwind v4's palette arrives as hex.
-
-**Vite's devtools and the HMR error overlay are off.** Neither has anywhere to draw in Unity, and an
-overlay rendered into a page nobody is looking at only hides the console message.
-
-Everything the config sets itself wins — the preset only fills in what was left out — and
-`react: false` drops `@vitejs/plugin-react` for a project that wants to configure React itself.
diff --git a/.tegami/2026-09-03-9c1f2a.md b/.tegami/2026-09-03-9c1f2a.md
deleted file mode 100644
index 4aacb810..00000000
--- a/.tegami/2026-09-03-9c1f2a.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-packages:
- "upm:com.reactunity.quickjs": patch
- "upm:com.reactunity.jint": patch
- "upm:com.reactunity.core": minor
----
-
-### A Vite entry document no longer crashes the editor, and its stylesheets now apply
-
-**The crash.** Pointing a scene at a Vite dev server took the Editor down with an access violation, and the cause turned out to be in the engine rather than the binding.
-
-QuickJS links a module graph and evaluates it in two depth-first passes, and both thread their traversal stack through the same field on each module — `JSModuleDef.stack_prev`. They are kept off each other's modules by a status check, and that check was incomplete: `js_inner_module_linking` returned early for a module already linking, linked or evaluated, but not for one being evaluated *right now*. A release build has no assertions, so a link pass that reached a running module fell through, pushed it, and overwrote the link the evaluation was holding. When that evaluation finished it popped along the spliced chain, never found the module it started from, and dereferenced null.
-
-Upstream cannot reach it, because loading a module there is synchronous and the two passes never interleave. Loading asynchronously — which is what this binding gained when it moved to quickjs-ng — is exactly what lets them, so the bug arrived with that feature and is fixed in the same fork: `gkurt/quickjs` `v0.16.2-reactunity.3`, with a regression case that segfaults without it. Every shipped binary is rebuilt.
-
-Two roots sharing a module is all it takes, which an entry document with two script tags gives you, plus any host binding a module body reaches that drains the job queue. `document.querySelectorAll` is one: it marshals its result by evaluating a script, and evaluating pumps. Vite's HMR client calls it at module scope.
-
-**The preamble race.** An entry document with more than one script used to evaluate all of them at once, which is not what document order means. Vite's dev server inlines the React Refresh preamble and then loads the app, and the app checks for what the preamble installs — evaluated concurrently, it could look before the preamble had written, because the fetches decided the order rather than the document. Host-initiated module roots are now evaluated one at a time, in document order, on QuickJS and on Jint alike. A graph that never settles will hold up the ones behind it; a graph that rejects settles normally, and a root that throws no longer strands the ones queued behind it.
-
-**Stylesheets in the entry document.** `` and `