@three-blocks/devtools 1.0.0-alpha.176.g8ff8a72e6369 → 1.0.0-alpha.189.g39cef51b7325

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +25 -2
  2. package/LICENSE +1 -2
  3. package/NOTICE +19 -27
  4. package/README.md +89 -144
  5. package/dist/browser/shader-capture.js +2 -2
  6. package/dist/{browser-smoke-76626IZQ.js → browser-smoke-HB7ZXQGR.js} +1 -1
  7. package/dist/chunk-3HTNEAVD.cjs +1 -0
  8. package/dist/chunk-3TQVLKUH.js +14 -0
  9. package/dist/chunk-54BHFG2E.js +76 -0
  10. package/dist/{chunk-ZKK6E42X.js → chunk-77HY5X2T.js} +1 -1
  11. package/dist/chunk-NEWSG5RX.js +3 -0
  12. package/dist/chunk-UQOPSJR6.js +6 -0
  13. package/dist/chunk-WNNN3UJI.js +93 -0
  14. package/dist/chunk-ZKXUYNSG.js +18 -0
  15. package/dist/cli.js +21 -21
  16. package/dist/index.d.ts +14 -10
  17. package/dist/index.js +21 -21
  18. package/dist/shader-browser-6TM4RNUL.js +2 -0
  19. package/dist/shader-browser-ZHG2JISC.js +1 -0
  20. package/dist/shader-capture-server.d.ts +6 -8
  21. package/dist/shader-capture-server.js +15 -15
  22. package/dist/{shader-config-4EXO5DKK.js → shader-config-BYBJUL3C.js} +1 -1
  23. package/dist/{shader-transform-CUkZn5Oa.d.ts → shader-transform-DSFaVrux.d.ts} +2 -0
  24. package/dist/{shader-watch-QHTNTSZE.js → shader-watch-Z3VGP4QB.js} +1 -1
  25. package/dist/shader-workflow-SO7WCR4Y.js +2 -0
  26. package/dist/{status-DV2BYZHR.js → status-CFJSWBDI.js} +1 -1
  27. package/dist/transform.cjs +1 -1
  28. package/dist/transform.d.ts +1 -1
  29. package/dist/transform.js +1 -1
  30. package/dist/webpack-loader.cjs +1 -1
  31. package/dist/webpack-loader.d.ts +1 -1
  32. package/dist/webpack-loader.js +1 -1
  33. package/package.json +3 -3
  34. package/dist/chunk-26FK4CRS.js +0 -6
  35. package/dist/chunk-4EHPYBKA.cjs +0 -1
  36. package/dist/chunk-HRYYNBVC.js +0 -3
  37. package/dist/chunk-INDAJN42.js +0 -94
  38. package/dist/chunk-ME3X2KFY.js +0 -14
  39. package/dist/chunk-SCJNCGMF.js +0 -17
  40. package/dist/chunk-VGJ3V4QQ.js +0 -78
  41. package/dist/shader-browser-65V22LLL.js +0 -1
  42. package/dist/shader-browser-JII6ZFCW.js +0 -2
  43. package/dist/shader-workflow-U4G565EB.js +0 -2
package/CHANGELOG.md CHANGED
@@ -1,8 +1,31 @@
1
1
  # @three-blocks/devtools
2
2
 
3
- ## 1.0.0-alpha.176.g8ff8a72e6369
3
+ ## 1.0.0-alpha.189.g39cef51b7325
4
+
5
+ - Tools: Example optimization now waits for loading and exits cleanly after parity.
6
+
7
+ - Website: Mobile navigation now opens from a responsive menu on every page.
8
+
9
+ - Website: Ocean water fills mobile screens without camera controls fighting touch.
10
+
11
+ - Website: Skinned text now starts quickly from a prebuilt Japanese MSDF atlas.
12
+
13
+ - Website: The overview sphere is floor-centered and pushes the pile more strongly.
14
+
15
+ - Website: Spotlight Type stays steady while scrolling.
16
+
17
+ - Website: Mobile smoke responds forcefully while water fills portrait screens and follows touch.
18
+
19
+ - Website: The 3D smoke scene now uses a clean, star-free sky.
20
+
21
+ - Website: Liquid Bunny stays clearly lit in portrait views.
22
+
23
+ - Website: Baked Motion loading posters now match the live scene size on portrait screens.
24
+
25
+ - Website: Release pages show the exact version with a short changelog.
26
+
27
+ - Packages: Built from `39cef51b7325`.
4
28
 
5
- - ci: keep alpha readiness release-scoped (`8ff8a72e6369`).
6
29
 
7
30
  This changelog is generated from Changesets.
8
31
 
package/LICENSE CHANGED
@@ -1,5 +1,4 @@
1
- Required Notice: Copyright (c) 2025-2026 Three Blocks https://threejs-blocks.com
2
- Required Notice: AI/ML training and dataset use are not licensed; text-and-data-mining rights reserved (EU 2019/790 Art. 4(3)). See NOTICE.
1
+ Required Notice: Copyright (c) 2025-2026 ロリンジャー株式会社 (Rohlinger K.K.), doing business as Three.js Blocks (https://threejs-blocks.com)
3
2
 
4
3
  # PolyForm Noncommercial License 1.0.0
5
4
 
package/NOTICE CHANGED
@@ -1,32 +1,24 @@
1
- Required Notice: Copyright (c) 2025-2026 Three Blocks https://threejs-blocks.com
2
- Required Notice: AI/ML training and dataset use are not licensed; text-and-data-mining rights reserved (EU 2019/790 Art. 4(3)). See NOTICE.
1
+ Required Notice: Copyright (c) 2025-2026 ロリンジャー株式会社 (Rohlinger K.K.), doing business as Three.js Blocks (https://threejs-blocks.com)
3
2
 
4
- Three Blocks AI / machine-learning usage notice
5
- =================================================
3
+ Three.js Blocks licensing notice
4
+ ================================
6
5
 
7
- This software is licensed under the PolyForm Noncommercial License 1.0.0
8
- (see LICENSE). The license grants only the permissions it enumerates, for
9
- noncommercial permitted purposes.
6
+ This software is offered under the PolyForm Noncommercial License 1.0.0:
7
+ https://polyformproject.org/licenses/noncommercial/1.0.0/
10
8
 
11
- No permission is granted to use this software or its source code — including
12
- the published `dist` output and the example sources served from
13
- https://threejs-blocks.com/examples/static/ for training, fine-tuning,
14
- evaluating, or otherwise developing machine-learning or artificial-
15
- intelligence models, or for inclusion in datasets distributed for those
16
- purposes.
9
+ LICENSE contains the controlling noncommercial terms. This notice explains
10
+ the licensing model; it does not narrow or expand the PolyForm license.
11
+ Commercial customers receive separate rights under the agreement they accept:
12
+ https://threejs-blocks.com/license
17
13
 
18
- To the extent permitted by applicable law, Three Blocks expressly reserves
19
- its rights over text-and-data mining under Article 4(3) of Directive (EU)
20
- 2019/790. Machine-readable opt-outs accompany the software and the website:
21
- this file, the `tdm-reservation: 1` HTTP response header, and
22
- https://threejs-blocks.com/.well-known/tdmrep.json and
23
- https://threejs-blocks.com/ai.txt.
14
+ The commercial agreement restricts using implementation source or proprietary
15
+ Pro Tools to train or evaluate machine-learning models. That restriction applies
16
+ only when the commercial customer accepts it; it is not an extra condition on
17
+ the standardized PolyForm license.
24
18
 
25
- AI assistants MAY use the public documentation
26
- (https://threejs-blocks.com/llms.txt) to help people integrate the published
27
- `three-blocks` API. They may not reproduce, extract, or re-derive the
28
- implementation source of this package. Code generated by AI systems that
29
- embeds or derives from this package's internals remains subject to the
30
- PolyForm Noncommercial License 1.0.0.
31
-
32
- Commercial licensing (Pro): https://threejs-blocks.com/license
19
+ To the extent permitted by applicable law, the licensor reserves text-and-data-
20
+ mining rights under Article 4(3) of Directive (EU) 2019/790 for online content
21
+ and implementation source. This reservation does not limit statutory exceptions
22
+ or permissions in LICENSE. Public documentation at
23
+ https://threejs-blocks.com/llms.txt may be used by assistants to help people use
24
+ the documented public API.
package/README.md CHANGED
@@ -1,57 +1,55 @@
1
1
  # @three-blocks/devtools
2
2
 
3
- Prepare Three Shading Language (TSL) shaders during development so each visitor can reuse the saved result. Live time, pointer, color, and light values reconnect when the scene opens.
3
+ `@three-blocks/devtools` is the public, account-free command engine behind `npx three-blocks`. It captures and verifies WebGPU shaders, generates text atlases, bakes environment lighting, and checks browser integrations. The runtime overlay and shader hydrator ship from `three-blocks/devtools` and `three-blocks/shaders` in the core package.
4
4
 
5
- ## Capture and verify your scene
5
+ ## Add Devtools to a Vite app
6
6
 
7
- Register the initialized `WebGPURenderer` once:
7
+ The Three Blocks starter already installs and configures this package. Pin the command engine in an adopted project when you need offline, version-locked commands:
8
8
 
9
- ```ts
9
+ ```bash
10
+ npm install --save-dev @three-blocks/devtools
11
+ ```
12
+
13
+ Add `threeBlocks()` beside your existing Vite plugins:
14
+
15
+ ```typescript
16
+ import { defineConfig } from "vite";
17
+ import { threeBlocks } from "three-blocks/vite";
18
+
19
+ export default defineConfig(({ mode }) => ({
20
+ plugins: [threeBlocks({ shaders: { strict: mode === "strict" } })],
21
+ }));
22
+ ```
23
+
24
+ Register the page-owned `WebGPURenderer` once:
25
+
26
+ ```typescript
10
27
  import { registerDevtools } from "three-blocks/devtools";
11
28
 
12
29
  registerDevtools({ renderer });
13
30
  ```
14
31
 
15
- Then capture:
32
+ Open the development overlay and click **Capture** for the current scene. Use the command for a route matrix, automated regeneration, or continuous integration (CI):
16
33
 
17
- ```sh
34
+ ```bash
18
35
  npx three-blocks shaders capture
19
36
  ```
20
37
 
21
- The first run creates `three-blocks.shaders.json` with a default `/` route when the
22
- project does not have one. Capture writes both the committed source artifact under
23
- `.three-blocks/shaders/` and its zero-import browser asset under
24
- `public/three-blocks/shaders/`. The registration line discovers that asset, holds the
25
- first renderer build while it loads, and installs it in development and production.
26
- An explicit `installShaderCache()` call remains available for advanced routing.
38
+ The first command-line capture creates `three-blocks.shaders.json` with a default `/` route when the project has no shader configuration. Capture writes a committed source artifact under `.three-blocks/shaders/` and a browser manifest under `public/three-blocks/shaders/`. `registerDevtools()` loads the matching manifest before the first shader build. Use `installShaderCache()` only when the app owns custom manifest transport.
27
39
 
28
- Vite is the golden path: add `threeBlocks()` from `three-blocks/vite`. In a Next.js,
29
- webpack, Rollup, or esbuild project, the capture command detects the bundler and checks
30
- its provider adapter. When wiring is missing, it prints the exact configuration diff
31
- and asks before applying it. Use `--yes` only after reviewing that diff when running
32
- non-interactively. The command starts a project-local Next.js server or builds and
33
- serves `dist/`, `build/`, or `out/` automatically.
40
+ For Next.js, webpack, Rollup, or esbuild, the capture command detects the bundler and checks its provider adapter. Missing wiring produces an exact configuration diff and requires confirmation. Review that diff before using `--yes` in a noninteractive shell. The command starts a project-local Next.js server or builds and serves `dist/`, `build/`, or `out/`.
34
41
 
35
- Use `--driver static --serve <dir>` for a nonstandard build directory, or `--url
36
- <url>` to attach to a server you started. Explicit driver and URL choices never edit
37
- bundler configuration.
42
+ Use `--driver static --serve build_directory` for a nonstandard build directory. Use `--url http://localhost:3000` to attach to a transformed server you started. Explicit driver and URL choices never edit bundler configuration.
38
43
 
39
- The overlay changes from **Live** to **Precompiled** after a fresh capture loads. It shows the skipped TSL builds and the project-specific **TSL build time saved** when `timing.local.json` matches the current capture. Shader-relevant edits mark both the capture and its timing stale, so the app builds live until you capture again.
44
+ The overlay changes from **Live** to **Precompiled** after a fresh capture loads. Each capture writes a receipt-matched estimate to `.three-blocks/shaders/timing.local.json`; `--commit-timing` also writes a shareable, hardware-labelled `timing.json`. `shaders test` replaces the local estimate with a median from repeated runs. The overlay reports skipped Three Shading Language (TSL) builds and estimated TSL work avoided only while timing matches the current receipt.
40
45
 
41
46
  `WebGLRenderer` stays on live shader building. `WebGPURenderer` also uses the live path when it selects a WebGL fallback.
42
47
 
43
48
  ### Three.js r185 compatibility patch
44
49
 
45
- Every adapter applies the same version-gated patch to `three/build/three.webgpu.js` in memory. It never writes `node_modules`. The r185 patch contains four independent changes:
50
+ Shader precompilation supports Three.js `>=0.185.0 <0.186.0`. Every adapter applies the same version-gated transform to `three/build/three.webgpu.js` in memory and never writes `node_modules`. Exact source anchors fail closed on unknown or partially patched builds. Current captures require precompiled manifest version `3` and shader receipt transform version `50`; recapture older artifacts instead of editing them.
46
51
 
47
- - [#34068](https://github.com/mrdoob/three.js/pull/34068) adds the node-builder debug callback used by capture.
48
- - [#34069](https://github.com/mrdoob/three.js/pull/34069) gives named node buffers deterministic labels.
49
- - [#34070](https://github.com/mrdoob/three.js/pull/34070) adds the public node-builder state provider used by hydration.
50
- - The local `compileAsync()` patch collects pipeline promises across one compile pass, yields after 8 ms work slices, then awaits the pipelines together. It captures each WebGPU error-scope promise before concurrent pipelines settle so the scopes remain balanced.
51
-
52
- Each change has exact source anchors and fails closed on drift or partial application. Current captures require precompiled manifest version `3` and shader receipt transform version `3`; recapture older artifacts instead of editing them.
53
-
54
- Delete an upstream backport when the supported Three.js release contains it. Reevaluate the local batching patch against each release. See [Maintain Three.js WebGPU compatibility](../../docs/maintenance/three-webgpu-release-compatibility.md) for markers, removal conditions, and verification.
52
+ The [Three.js WebGPU compatibility reference](../../docs/maintenance/three-webgpu-release-compatibility.md) defines the released r185 patches, source markers, removal conditions, and verification gates.
55
53
 
56
54
  ### Manual bundler adapters
57
55
 
@@ -59,39 +57,36 @@ These are the manual equivalents of the diff that `shaders capture` offers.
59
57
 
60
58
  esbuild:
61
59
 
62
- ```js
60
+ ```typescript
61
+ import { build } from "esbuild";
63
62
  import { createEsbuildShaderPlugin } from "@three-blocks/devtools/transform";
64
63
 
65
64
  await build({
66
- // ...
67
65
  plugins: [createEsbuildShaderPlugin({ root: process.cwd() })],
68
66
  });
69
67
  ```
70
68
 
71
69
  Rollup:
72
70
 
73
- ```js
71
+ ```typescript
74
72
  import { createRollupShaderPlugin } from "@three-blocks/devtools/transform";
75
73
 
76
74
  export default {
77
- // ...
78
75
  plugins: [createRollupShaderPlugin({ root: process.cwd() })],
79
76
  };
80
77
  ```
81
78
 
82
79
  webpack:
83
80
 
84
- ```js
81
+ ```typescript
85
82
  import { withThreeBlocksWebpack } from "@three-blocks/devtools/transform";
86
83
 
87
- export default withThreeBlocksWebpack({
88
- // ...
89
- });
84
+ export default withThreeBlocksWebpack({});
90
85
  ```
91
86
 
92
87
  Next.js:
93
88
 
94
- ```ts
89
+ ```typescript
95
90
  import type { NextConfig } from "next";
96
91
  import { withThreeBlocksNext } from "@three-blocks/devtools/transform";
97
92
 
@@ -102,153 +97,103 @@ const nextConfig: NextConfig = {
102
97
  export default withThreeBlocksNext(nextConfig);
103
98
  ```
104
99
 
105
- The adapters always install the production provider hook. They add capture
106
- instrumentation only when `THREE_BLOCKS_SHADER_TOOL=1`; a tool-managed build or server
107
- sets that automatically. For a manually started webpack or Next.js server, set the
108
- variable yourself and run `shaders capture --url http://localhost:3000`.
100
+ The adapters always install the production provider hook. They add capture instrumentation only when `THREE_BLOCKS_SHADER_TOOL=1`; a tool-managed build or server sets that automatically. For a manually started webpack or Next.js server, set the variable yourself and run `npx three-blocks shaders capture --url http://localhost:3000`.
109
101
 
110
- ## Reference
102
+ ## Command reference
111
103
 
112
- The public command surface is `npx three-blocks`. This package also exposes the direct `three-blocks-devtools` binary for package-local and repository maintenance.
104
+ Use `npx three-blocks` in applications. This package also exposes `three-blocks-devtools` for package-local and repository maintenance.
113
105
 
114
- All commands support `--json` (stable machine output; human output stays line-oriented and
115
- uncolored when piped). Static status validates `three-blocks.json`, committed shader
116
- manifests, installed compatibility versions, the installed public `three-blocks/shaders`
117
- runtime closure, and independently discovered shader-relevant source inputs. Runtime
118
- evidence (worker, codecs, HMR) comes from the last `browser smoke` run and is reported as
119
- a dated verification, never as live state.
106
+ | Command | Result |
107
+ | --------------------------------------------- | --------------------------------------------------------------------------- |
108
+ | `npx three-blocks status` | Report worker, asset, shader, and text state |
109
+ | `npx three-blocks shaders` | Verify shader freshness without a browser or graphics processing unit (GPU) |
110
+ | `npx three-blocks shaders capture --if-stale` | Capture changed scenes and write a local timing estimate |
111
+ | `npx three-blocks shaders test --parity-only` | Run one live and precompiled correctness pair per scene |
112
+ | `npx three-blocks shaders test` | Run parity, repeated timing, and the published-page soak |
113
+ | `npx three-blocks shaders watch` | Recapture when shader inputs change |
114
+ | `npx three-blocks text generate` | Generate multi-channel signed distance field (MSDF) atlases and receipts |
115
+ | `npx three-blocks text status` | Verify text assets and glyph coverage |
116
+ | `npx three-blocks environment bake` | Bake a prefiltered environment KTX2 |
117
+ | `npx three-blocks browser smoke` | Verify development readiness and hot module replacement (HMR) |
118
+ | `npx three-blocks browser preview` | Build and verify the production preview |
119
+
120
+ All commands support `--json` and `--reporter json`. `status` reads generated `three-blocks.json` metadata when present; adopted projects need only their shader or text configuration. Static status validates committed artifacts, compatibility versions, the installed `three-blocks/shaders` runtime closure, and discovered shader inputs. Browser evidence comes from the last `browser smoke` run and remains a dated verification, not live state.
120
121
 
121
122
  ### Precompile WebGPU shaders
122
123
 
123
124
  ```bash
124
- three-blocks-devtools shaders status --check # no browser or GPU
125
- three-blocks-devtools shaders capture --if-stale # isolated GPU context per scene
126
- three-blocks-devtools shaders test --parity-only # one fast zero-build + pixel pair
127
- three-blocks-devtools shaders test # parity + timing + published-page soak
128
- three-blocks-devtools shaders test --skip-browser --mode strict
129
- # CI freshness/schema gate
130
- three-blocks-devtools shaders watch --debounce 250
125
+ npx three-blocks shaders status --check
126
+ npx three-blocks shaders capture --if-stale
127
+ npx three-blocks shaders test --parity-only
128
+ npx three-blocks shaders test
129
+ npx three-blocks shaders watch --debounce 250
131
130
  ```
132
131
 
133
- Projects may declare the complete capture matrix in `three-blocks.shaders.json`:
132
+ Add `three-blocks.shaders.json` when the project needs multiple routes, a semantic scene name, or an explicit readiness signal:
134
133
 
135
134
  ```json
136
135
  {
137
136
  "schemaVersion": 1,
138
137
  "scenes": [
139
- { "key": "default", "url": "/?scene=default" },
140
- { "key": "text", "url": "/?scene=text", "requiresText": true }
138
+ { "key": "main", "url": "/" },
139
+ { "key": "text", "url": "/text", "requiresText": true }
141
140
  ],
142
- "settleFrames": 60,
143
- "timeoutMs": 240000,
144
- "viewport": { "width": 1024, "height": 640 },
145
- "parity": { "frames": 90, "channelTolerance": 8, "maxDiffRatio": 0.01 },
146
- "readiness": { "global": "__THREE_BLOCKS_READY__" },
147
- "publicDir": "public",
148
- "allowLiveBuilds": true
141
+ "readiness": { "global": "__THREE_BLOCKS_READY__" }
149
142
  }
150
143
  ```
151
144
 
152
- Readiness is optional. Its global may be `true` or a promise; a selector is also
153
- supported. With no override, the engine waits for its settled-frame and first-frame
154
- contract and assumes nothing about application DOM.
155
-
156
- This workflow is the main purpose of `@three-blocks/devtools`. Capture uses a version-gated r185 transform supplied by the selected bundler adapter. The transform journals real
157
- render and compute `NodeBuilder` states, resolves stable keys through the public
158
- `three-blocks/shaders` cache, exposes loopback readiness/telemetry, and uploads a typed payload.
159
- The generated application owns no capture harness or patcher, and this tool never writes to
160
- `node_modules`. A Three.js version or transform-anchor mismatch fails closed.
161
-
162
- All configured scenes must pass before the tool replaces deterministic
163
- `.three-blocks/shaders/<scene>.webgpu.ts` modules; `meta.json` is the last commit marker. It records
164
- runtime/tool/schema versions, a `threeBlocksShaderClosure` hash, shader-relevant app-source hashes,
165
- bytes, stage coverage, and skipped render/compute builds. App hashing begins at scene modules and
166
- real shader registrations and follows only local runtime imports. Unrelated modules, type-only
167
- imports, and DOM copy are not freshness inputs. Relevant source changes during capture abort the
168
- commit. `watch` is explicitly opt-in and permits
169
- only one running capture plus one coalesced rerun; failures preserve the prior committed receipt.
170
- Explicit stable keys remain the clearest choice for complex, conditional capture matrices.
171
- When an otherwise unregistered application or Three-internal build is first observed,
172
- capture assigns it a deterministic scene-scoped key and records that automatic namespace
173
- in the manifest. Set `allowLiveBuilds: false` when a project intentionally requires any
174
- build that still cannot be addressed to fail capture.
175
-
176
- `shaders test` first repeats the no-GPU matrix inspection. Its browser gate then proves that the
177
- live baseline builds every registered render pipeline and compute kernel, while the fresh path
178
- performs zero registered builds, covers render and compute injection independently, reports no
179
- misses, reaches first-frame readiness, renders non-black output, and matches deterministic pixels.
180
- Successful scenes are checkpointed immediately against their scene receipt and the shared
181
- runtime/tool contract, so a later failure can resume at the missing scene. `--parity-only` runs
182
- one live/precompiled pair without timing warmups, repeats, or the published-page soak. The default
183
- mode retains those slower measurements and production-page checks. A parity observation that
184
- returns no result is capped at 10 seconds.
185
- On parity failure it writes live, precompiled, and diff PNGs under
186
- `.three-blocks/shaders/parity/`.
145
+ Readiness is optional. Its global may be `true` or a promise; a selector is also supported. With no override, the engine waits for its settled-frame and first-frame contract and assumes nothing about the application DOM.
146
+
147
+ Capture observes real render and compute `NodeBuilder` states, then writes a deterministic pooled v3 manifest. The generated application owns no capture harness, and the tooling never writes to `node_modules`. Missing keys, stale receipts, unsupported Three.js versions, and hydration mismatches fail closed to live shader building.
148
+
149
+ Artifact writes are transactional. `meta.json` records runtime, tool, schema, source-input, byte, and stage-coverage evidence. Relevant source changes during capture abort the write, and failures preserve the prior committed receipt. Explicit stable keys remain the clearest choice for conditional capture matrices; otherwise, capture assigns deterministic scene-scoped keys. Set `allowLiveBuilds: false` when every build must belong to the declared matrix.
150
+
151
+ `shaders test` first repeats the GPU-free matrix inspection. Its browser gate proves that the live baseline builds every registered render pipeline and compute kernel. The fresh path must perform zero registered builds, report no misses, reach first-frame readiness, render non-black output, and match deterministic pixels.
152
+
153
+ Successful scenes are checkpointed against their scene receipt and the shared runtime and tool contract. A later run can resume at the missing scene. `--parity-only` runs one live and precompiled pair without timing warmups, repeats, or the published-page soak. The default mode retains those measurements and production-page checks. A parity observation is capped at 10 seconds. Failures write live, precompiled, and diff PNGs under `.three-blocks/shaders/parity/`.
187
154
 
188
155
  ### Verify a browser integration
189
156
 
190
157
  ```bash
191
- three-blocks-devtools browser smoke --route / --json
192
- three-blocks-devtools browser smoke --hmr src/offscreen/meshes/Scene.ts
158
+ npx three-blocks browser smoke --route / --json
159
+ npx three-blocks browser smoke --hmr src/offscreen/meshes/Scene.ts
160
+ npx three-blocks browser preview --route /
193
161
  ```
194
162
 
195
- The smoke gate loads the project's real Vite config on an ephemeral loopback port. It requires
196
- the visible OffscreenCanvas worker plus `workerReady`, `assetsReady`, and `compileEnd`; it also
197
- requires `textReady` when the Vite text configuration is enabled. Every configured Draco and
198
- KTX2 route is fetched, the lazy Meshopt decoder is initialized, page and console errors fail the
199
- run, and both the WebGPU screenshot and readable 2D panels are checked for an all-black frame.
163
+ The smoke gate loads the project's Vite config on an ephemeral loopback port. It requires the visible OffscreenCanvas worker plus `workerReady`, `assetsReady`, and `compileEnd`. It also requires `textReady` when the Vite text configuration is enabled. Every configured Draco and KTX2 route is fetched, the lazy Meshopt decoder is initialized, and page or console errors fail the run. The gate checks the WebGPU screenshot and readable 2D panels for an all-black frame.
200
164
 
201
165
  The command reads the starter's built-in readiness check. Application tutorials describe the visible **Starting**, **Ready**, **Precompiled**, and **Live** states instead of this maintainer contract. Contributors can inspect the exact protocol in the [maintainer browser-verification reference](../../docs/maintenance/browser-verification.md).
202
166
 
203
- `--hmr <project-relative-module>` emits a synthetic watcher change through Vite for an already
204
- loaded scene module. It runs the real HMR graph without writing or touching source and verifies
205
- that the browser acknowledges the update while lifecycle readiness remains stable.
167
+ `--hmr project_relative_module` emits a synthetic watcher change through Vite for an already loaded scene module. It runs the HMR graph without changing source and verifies that the browser acknowledges the update while lifecycle readiness remains stable.
206
168
 
207
- Only the two documented ambient diagnostics exported in `DOCUMENTED_BROWSER_NOISE` are filtered:
208
- Three Inspector's invalid `extensions.json` response and Chromium's experimental WebGPU notice.
169
+ Only the two ambient diagnostics exported in `DOCUMENTED_BROWSER_NOISE` are filtered: Three Inspector's invalid `extensions.json` response and Chromium's experimental WebGPU notice.
209
170
 
210
171
  ### Bake environment lighting
211
172
 
212
173
  ```bash
213
- three-blocks-devtools environment bake --size 256
214
- three-blocks-devtools environment bake --output src/assets/environment/studio.pmrem.ktx2 --json
174
+ npx three-blocks environment bake --size 256
175
+ npx three-blocks environment bake \
176
+ --output src/assets/environment/studio.pmrem.ktx2 --json
215
177
  ```
216
178
 
217
- The browser entry renders Three.js `RoomEnvironment` through WebGPU and exports the PMREM CubeUV
218
- atlas. Node validates RGBA16F topology, zstd-compresses at a deterministic level, decodes every
219
- level byte-for-byte, records the final SHA-256 checksum, and transactionally replaces the KTX2
220
- and JSON metadata pair. Size, time, upload, path, and file bounds are enforced. `--no-zstd` is an
221
- explicit compatibility opt-out.
179
+ The browser entry renders Three.js `RoomEnvironment` through WebGPU and exports the PMREM CubeUV atlas. Node validates RGBA16F topology, compresses it with zstd at a deterministic level, decodes every level byte-for-byte, records the SHA-256 checksum, and transactionally replaces the KTX2 and JSON metadata pair. Size, time, upload, path, and file bounds are enforced. `--no-zstd` is an explicit compatibility opt-out.
222
180
 
223
- Both GPU commands accept `--root <path>` for integration workspaces that intentionally do
224
- not carry generated-project metadata. Normal generated projects are discovered automatically.
181
+ Both GPU commands accept `--root project_path` for integration workspaces that intentionally omit generated-project metadata. Generated projects are discovered automatically.
225
182
 
226
183
  ### Ship it
227
184
 
228
- Commit `.three-blocks/shaders/` and the generated public manifests, then add one
229
- GPU-less CI command:
185
+ Commit `.three-blocks/shaders/` and the generated public manifests, then add one GPU-free CI command:
230
186
 
231
- ```sh
187
+ ```bash
232
188
  npx three-blocks shaders test --skip-browser --mode strict
233
189
  ```
234
190
 
235
- Use `--reporter json` for CI annotations. Run the full `shaders test` in an optional
236
- WebGPU lane. Production selects the hydration-only `three-blocks/devtools` condition:
237
- overlay and stats implementation bytes are absent, while the bounded
238
- `three-blocks/shaders` runtime remains. Opt into its local production console receipt
239
- with `threeBlocks({ stats: { production: true } })`; no telemetry leaves the app.
191
+ Use `--reporter json` for CI annotations. Run the full `shaders test` in an optional WebGPU lane. Production selects the hydration-only `three-blocks/devtools` condition. Overlay and statistics implementation bytes are absent, while the bounded `three-blocks/shaders` runtime remains. Opt into its local production console receipt with `threeBlocks({ stats: { production: true } })`; no telemetry leaves the app.
240
192
 
241
- Text artifacts remain `missing` or `invalid` until configured glyph coverage, checksums,
242
- orientation, and KTX2 decode round-trip validation succeed. No command performs account or
243
- entitlement checks.
193
+ Text artifacts remain `missing` or `invalid` until configured glyph coverage, checksums, orientation, and KTX2 decode round-trip validation succeed. No command performs account or entitlement checks.
244
194
 
245
- ## License
195
+ ## License and Pro terms
246
196
 
247
- Free for personal and noncommercial projects. Commercial projects are covered
248
- by the Pro plan's lifetime license — each project you start while your plan is
249
- active is licensed forever, for the versions released while it was active. No
250
- runtime gating.
197
+ This package uses [PolyForm Noncommercial 1.0.0](./LICENSE). Personal and noncommercial projects can install and run every Devtools command without an account, Pro seat, or runtime entitlement check. Keep the Required Notice when redistributing the package.
251
198
 
252
- This package uses the [PolyForm Noncommercial 1.0.0 license](./LICENSE). Keep
253
- the Required Notice when redistributing it; full commercial terms are at
254
- [threejs-blocks.com/license](https://threejs-blocks.com/license).
199
+ Pro is a per-seat subscription. During an active period, each person who starts or develops a new commercial Project, adopts a later software version, or downloads or updates a Pro Tool needs a named seat. Each Project started during that period receives a lifetime commercial license for versions released during the same period. After cancellation, the Project may be maintained, updated, and distributed with those covered versions, and Pro Tool versions obtained during the active period may keep running locally and offline for that Project. Starting another commercial Project, adopting a later release, or downloading or updating a Pro Tool requires an active subscription. Devtools remains account-free because commercial permission is a license boundary, not a feature gate. See the [Commercial License Agreement](https://threejs-blocks.com/license) and [pricing](https://threejs-blocks.com/pricing).