@field/cascade 0.3.1 → 0.5.1

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 (129) hide show
  1. package/AGENTS.md +32 -9
  2. package/ARCHITECTURE.md +75 -13
  3. package/CHANGELOG.md +98 -1
  4. package/CONTRIBUTING.md +104 -0
  5. package/DESIGN.md +24 -15
  6. package/README.md +121 -14
  7. package/dist/assets/{CodeEditor-D22fVi-4.js → CodeEditor-dOrU3aQg.js} +7 -7
  8. package/dist/assets/{CodePanel-DPNEYfcR.js → CodePanel-Bqy85qen.js} +2 -2
  9. package/dist/assets/{CustomNodeDialog-DeHCAvgb.js → CustomNodeDialog-DkZlOgjs.js} +1 -1
  10. package/dist/assets/{ProjectSettings-DWpVtWEx.js → ProjectSettings-D192mr6g.js} +2 -2
  11. package/dist/assets/{SettingsDialog-za00IS3L.js → SettingsDialog-BTeeIE3T.js} +1 -1
  12. package/dist/assets/{VersionHistoryDialog-DTMGhI0_.js → VersionHistoryDialog-TZQKkn3Y.js} +1 -1
  13. package/dist/assets/{core-JsyKMO1k.js → core-DwbcGL0o.js} +2 -2
  14. package/dist/assets/{cssMode-emdRheFK.js → cssMode-Dcjn356x.js} +1 -1
  15. package/dist/assets/definitions-C_SY6Bhg.js +1 -0
  16. package/dist/assets/{editor.api-xHX-fMSo.js → editor.api-D7Q83606.js} +1 -1
  17. package/dist/assets/{freemarker2-C3M8_Gs3.js → freemarker2-DCCiHlV6.js} +1 -1
  18. package/dist/assets/geo-CT-wtvaE.js +1 -0
  19. package/dist/assets/{handlebars-CBMurtFk.js → handlebars-BCxC8xu1.js} +1 -1
  20. package/dist/assets/{html-xbLQwknw.js → html-COwepzSd.js} +1 -1
  21. package/dist/assets/{htmlMode-2wKdDTon.js → htmlMode-Dpg7H0rx.js} +1 -1
  22. package/dist/assets/{image-i1j6nWKe.js → image-CMfMMxlC.js} +3 -3
  23. package/dist/assets/index-De1cIZ9N.js +212 -0
  24. package/dist/assets/index-ilgbOu6G.css +1 -0
  25. package/dist/assets/{javascript-DJaOo_2I.js → javascript-CSwWxfLr.js} +1 -1
  26. package/dist/assets/{jsonMode-Bheas8_0.js → jsonMode-BXRriTpj.js} +1 -1
  27. package/dist/assets/{liquid-BCj_BGbM.js → liquid-Cmkfyogc.js} +1 -1
  28. package/dist/assets/{lspLanguageFeatures-BfIsx_xz.js → lspLanguageFeatures-xH9JbZGO.js} +1 -1
  29. package/dist/assets/{mdx-DwiQDiVO.js → mdx-BzrNjNvK.js} +1 -1
  30. package/dist/assets/nodeTypeUtils-BDJsc2Ks.js +1 -0
  31. package/dist/assets/pop-BdKEHslJ.js +1 -0
  32. package/dist/assets/{python-BjrB5nqj.js → python-D4E9jbx7.js} +1 -1
  33. package/dist/assets/{razor-CfoBmGDs.js → razor-B3x9cIEM.js} +1 -1
  34. package/dist/assets/{tsMode-BcEoMSxp.js → tsMode-dhQYPNMZ.js} +1 -1
  35. package/dist/assets/{typescript-DIg7TEmQ.js → typescript-CITkDxAE.js} +1 -1
  36. package/dist/assets/{workers-vXYuwtPw.js → workers-BQvF9bbO.js} +1 -1
  37. package/dist/assets/{xml-DexLQIQy.js → xml-DvHlU3A8.js} +1 -1
  38. package/dist/assets/{yaml-DUnD_1dE.js → yaml-uznsLgs8.js} +1 -1
  39. package/dist/cli/index.js +16465 -12096
  40. package/dist/cli/runtime/gpu.ts +71 -0
  41. package/dist/cli/runtime/io.ts +31 -25
  42. package/dist/contracts/camera.d.ts +70 -0
  43. package/dist/contracts/camera.js +27 -0
  44. package/dist/contracts/capabilities.d.ts +6 -6
  45. package/dist/contracts/definition.d.ts +62 -4
  46. package/dist/contracts/index.d.ts +4 -0
  47. package/dist/contracts/index.js +4 -0
  48. package/dist/contracts/particles.d.ts +54 -0
  49. package/dist/contracts/particles.js +167 -0
  50. package/dist/contracts/scene.d.ts +129 -0
  51. package/dist/contracts/scene.js +73 -0
  52. package/dist/contracts/schema.js +26 -3
  53. package/dist/contracts/series.d.ts +75 -0
  54. package/dist/contracts/series.js +2 -0
  55. package/dist/contracts/validate.js +23 -5
  56. package/dist/contracts/values.d.ts +4 -2
  57. package/dist/contracts/values.js +10 -0
  58. package/dist/gpu.d.ts +17 -0
  59. package/dist/gpu.js +61 -1
  60. package/dist/index.html +3 -3
  61. package/dist/io.d.ts +4 -16
  62. package/dist/io.js +26 -8
  63. package/dist/player/app.js +810 -0
  64. package/dist/player/embed.d.ts +4 -0
  65. package/dist/player/embed.js +77 -0
  66. package/dist/player/types.d.ts +35 -0
  67. package/dist/runtime/builtins/core/camera.d.ts +252 -0
  68. package/dist/runtime/builtins/core/camera.js +149 -0
  69. package/dist/runtime/builtins/core/index.d.ts +4 -2
  70. package/dist/runtime/builtins/core/index.js +8 -2
  71. package/dist/runtime/builtins/core/structural.d.ts +168 -0
  72. package/dist/runtime/builtins/core/structural.js +175 -0
  73. package/dist/runtime/builtins/core/time.d.ts +165 -0
  74. package/dist/runtime/builtins/core/time.js +110 -0
  75. package/dist/runtime/builtins/geo/definitions.d.ts +247 -0
  76. package/dist/runtime/builtins/geo/definitions.js +70 -0
  77. package/dist/runtime/builtins/geo/index.d.ts +2 -1
  78. package/dist/runtime/builtins/geo/index.js +3 -1
  79. package/dist/runtime/builtins/geo/render.d.ts +87 -0
  80. package/dist/runtime/builtins/geo/render.js +87 -0
  81. package/dist/runtime/builtins/geo/svgExport.d.ts +11 -0
  82. package/dist/runtime/builtins/geo/svgExport.js +10 -0
  83. package/dist/runtime/builtins/index.d.ts +5 -2
  84. package/dist/runtime/builtins/index.js +13 -3
  85. package/dist/runtime/builtins/pop/definitions.d.ts +2120 -0
  86. package/dist/runtime/builtins/pop/definitions.js +815 -0
  87. package/dist/runtime/builtins/pop/index.d.ts +2 -0
  88. package/dist/runtime/builtins/pop/index.js +2 -0
  89. package/dist/runtime/builtins/scene/definitions.d.ts +356 -0
  90. package/dist/runtime/builtins/scene/definitions.js +224 -0
  91. package/dist/runtime/builtins/scene/index.d.ts +2 -0
  92. package/dist/runtime/builtins/scene/index.js +2 -0
  93. package/dist/runtime/camera/index.d.ts +60 -0
  94. package/dist/runtime/camera/index.js +234 -0
  95. package/dist/runtime/definition/architecture.js +36 -1
  96. package/dist/runtime/geometry/render.d.ts +109 -0
  97. package/dist/runtime/geometry/render.js +145 -0
  98. package/dist/runtime/geometry/svg.d.ts +29 -0
  99. package/dist/runtime/geometry/svg.js +11 -5
  100. package/dist/runtime/gpu.d.ts +33 -0
  101. package/dist/runtime/gpu.js +218 -0
  102. package/dist/runtime/index.d.ts +4 -0
  103. package/dist/runtime/index.js +4 -0
  104. package/dist/runtime/pop/cache.d.ts +27 -0
  105. package/dist/runtime/pop/cache.js +123 -0
  106. package/dist/runtime/pop/forces.d.ts +202 -0
  107. package/dist/runtime/pop/forces.js +519 -0
  108. package/dist/runtime/pop/index.d.ts +5 -0
  109. package/dist/runtime/pop/index.js +5 -0
  110. package/dist/runtime/pop/state.d.ts +136 -0
  111. package/dist/runtime/pop/state.js +283 -0
  112. package/dist/runtime/pop/trail.d.ts +62 -0
  113. package/dist/runtime/pop/trail.js +142 -0
  114. package/dist/runtime/runtime.js +284 -9
  115. package/dist/runtime/scene/index.d.ts +50 -0
  116. package/dist/runtime/scene/index.js +94 -0
  117. package/dist/runtime/series/index.d.ts +41 -0
  118. package/dist/runtime/series/index.js +167 -0
  119. package/dist/runtime/types.d.ts +1 -1
  120. package/dist/studio/panel.d.ts +68 -1
  121. package/doc/HEADLESS_GPU.md +160 -0
  122. package/doc/NODE_REFERENCE.md +408 -1
  123. package/doc/PROJECT_AUTHORING.md +118 -20
  124. package/doc/WEB_PLAYER.md +131 -0
  125. package/package.json +25 -3
  126. package/dist/assets/geo-BAR6lQp5.js +0 -1
  127. package/dist/assets/index-BDV5xGBZ.css +0 -1
  128. package/dist/assets/index-CMcH8AgP.js +0 -212
  129. package/dist/assets/nodeTypeUtils-BBA1JqHx.js +0 -1
package/README.md CHANGED
@@ -2,24 +2,55 @@
2
2
 
3
3
  Cascade is a TypeScript node-graph runtime and optional visual workspace for generative design. It is built for projects that move between interactive web work, WebGL, print, motion, sound, Python, and external services without rebuilding the surrounding application infrastructure each time.
4
4
 
5
- Created by Marcus Wendt at [FIELD.IO](https://www.field.io).
5
+ Created by Marcus Wendt at [FIELD.IO](https://www.field.io). Free and open source
6
+ under the MIT license. [Getting started and features](https://cascade.field.io).
6
7
 
7
8
  ## What Cascade provides
8
9
 
9
10
  - A typed, inspectable graph model with lazy execution and explicit triggers.
10
11
  - Deterministic custom-node definitions that tools can inspect without running user code.
11
- - The same runtime in Studio, a Node service, or a UI-free browser application.
12
+ - An environment-neutral runtime for Node services and UI-free browser applications.
13
+ - A standalone browser player: build static pages and embeddable sketches without a Studio server.
14
+ - A Studio compatibility controller that already presents deterministic definitions alongside dynamic project nodes while its graph engine migrates to the neutral runtime.
12
15
  - Project-native `.cascade` files, assets, presets, and Git-backed version history.
13
16
  - Nested subnets with persistent hierarchy.
17
+ - Geometry-native particles, explicit Feedback loops, bounded simulation checkpoints, and printable trail geometry.
18
+ - Scenes with cameras and lights, a 3D Viewer, and shared CPU wireframe/point rendering.
14
19
  - Expressions on parameters, with Houdini's variables and functions: `$F`, `$FF`, `$T`, `$FPS`, and `ch()` to read another parameter.
15
20
  - Keyframe channels on parameters, edited through a timeline panel with transport, playhead, scrubbing, and a dope sheet.
16
- - Offline rendering with `cascade run`, including `--frames 1-100` for a numbered image sequence, rasterised through Skia rather than a browser.
21
+ - Offline rendering with `cascade run`: Skia for Canvas2D, optional Dawn for compatible WebGPU nodes, and `--frames 1-100` for numbered image sequences.
17
22
  - A coding-agent console per project, running in the project directory, with a watcher that picks up the files it rewrites without a reload.
18
- - Explicit browser and server capabilities for WebGL, files, media, Python, and allowlisted shell commands.
23
+ - Explicit browser and server capabilities for WebGPU, files, media, Python, and allowlisted shell commands.
19
24
  - A Svelte Studio with an infinite canvas, Inspector, Viewer, timeline, and project workbench.
20
25
 
21
26
  Cascade separates the generative algorithm from the platform. Custom nodes describe stages of a pipeline; the runtime schedules and validates them; hosts supply environment-specific capabilities; Studio is only one possible frontend.
22
27
 
28
+ ## New in 0.5
29
+
30
+ Build a visual system once, then use its supported host for print, stills,
31
+ motion frames or an interactive web embed. This release adds the standalone
32
+ player and hardens the geometry, simulation and scene tools added during 0.4:
33
+
34
+ - **Web delivery:** `cascade build` packages a compatible graph and its explicit
35
+ assets. Embeds have independent runtimes, playback, parameter/input controls,
36
+ image downloads and disposal; no editor or Cascade API is required.
37
+ - **Geometry and subnets:** compose shapes, transforms and copies through one
38
+ geometry type; organize reusable networks with typed Input/Output boundaries.
39
+ - **Particles and feedback:** wire sources, forces and a solver, retain bounded
40
+ history, and turn particle trails into geometry for SVG or raster output.
41
+ Checkpoint reuse now preserves complete trails; nested Feedback respects loop
42
+ ownership and dependency order.
43
+ - **Scenes and cameras:** assemble geometry, a camera and lights, inspect in the
44
+ 3D Viewer, and use shared camera math for output. Rendering currently draws
45
+ wireframes and points; lights do not yet shade surfaces.
46
+ - **Agent-ready rendering:** static node checks, finite render timeouts and JSON
47
+ image manifests let an agent edit, render and inspect results. Dawn is optional
48
+ native WebGPU for the Node host, not a browser emulator or model integration.
49
+
50
+ Studio now uses only its active Dockview layout; the unreachable old window UI
51
+ has been removed. No new dependencies or graph engine were introduced for the
52
+ player. See the [changelog](CHANGELOG.md) for release details.
53
+
23
54
  ## Install
24
55
 
25
56
  Cascade needs Node.js 22.13 or newer.
@@ -29,7 +60,9 @@ npm install -g @field/cascade
29
60
  cascade --version
30
61
  ```
31
62
 
32
- That installs the `cascade` command: `cascade new` scaffolds a project, `cascade <directory>` opens it in Studio, and `cascade run` renders a graph headlessly.
63
+ That installs the latest published release and the `cascade` command: `cascade new` scaffolds a project, `cascade <directory>` opens it in Studio, and `cascade run` executes a graph headlessly. A generated project records the published package under the local alias `cascade`, so imports such as `cascade/contracts` resolve to `@field/cascade`.
64
+
65
+ The repository checkout can be ahead of the published release, even with the same version number. Use the global install to scaffold projects, then use their npm scripts or `npx --no-install cascade` to select the project-local version. For checkout development, see [Contributing](CONTRIBUTING.md). When diagnosing a difference, record the installed version and whether it resolves to a local checkout; a version match alone does not prove the same code is installed.
33
66
 
34
67
  Offline image rendering uses Skia through `@napi-rs/canvas`, an optional dependency of about 26 MB. It installs by default; if you skipped optional dependencies, add it yourself:
35
68
 
@@ -63,10 +96,15 @@ npm run build:cli
63
96
 
64
97
  ## Create a project
65
98
 
99
+ `cascade new` scaffolds a project and starts Studio. After stopping that first
100
+ server, install the project's dependencies before reopening it. The example
101
+ below assumes the default projects directory; `cascade projects` reports yours.
102
+
66
103
  ```bash
67
104
  cascade new my-artwork
68
105
  cd ~/Documents/Cascade/my-artwork
69
- cascade .
106
+ npm install
107
+ npx --no-install cascade .
70
108
  ```
71
109
 
72
110
  Studio binds to loopback by default. To use a Cascade workstation over a
@@ -81,6 +119,18 @@ both the bind target and allowed browser hostname. Use repeatable
81
119
  `--trusted-host` only when the bind address and browser hostname differ.
82
120
  Wildcard remote binds, unknown options, and invalid ports fail immediately.
83
121
 
122
+ An HTTPS reverse proxy may terminate TLS and forward to a loopback Studio. In
123
+ that case, name both sides explicitly:
124
+
125
+ ```bash
126
+ cascade . --host 127.0.0.1 --port 3030 --trusted-host cascade.example.internal
127
+ ```
128
+
129
+ The proxy must preserve the browser's exact `Host`. If the external URL uses a
130
+ non-default port, include it in `--trusted-host`. Use `--no-open` and open the
131
+ HTTPS URL yourself: automatic opening still uses an HTTP URL. This flag admits
132
+ the authority; it does not configure TLS or the proxy itself.
133
+
84
134
  A project is an ordinary directory or Git repository:
85
135
 
86
136
  ```text
@@ -105,6 +155,33 @@ cascade run index.cascade
105
155
 
106
156
  See [Project authoring](doc/PROJECT_AUTHORING.md) for project layout, nodes, `.cascade` files, capabilities, and headless embedding.
107
157
 
158
+ ## Publish a browser sketch
159
+
160
+ The standalone player in Cascade 0.5+ exports compatible definition-v1 graphs to
161
+ static files, without Studio or a Cascade server:
162
+
163
+ ```bash
164
+ cascade build index.cascade --out web-player
165
+ ```
166
+
167
+ Serve the generated directory through a static HTTP server or hosting service.
168
+ Open `index.html`, embed `player.html` in an iframe, or import `embed.js` for
169
+ same-origin controls. Server/Python/shell-dependent graphs must first separate
170
+ or replace those stages; export does not move them into the browser silently.
171
+ See [Browser player](doc/WEB_PLAYER.md) for assets, inputs, animation and limits.
172
+
173
+ For example, after hosting the output at `/artwork/`:
174
+
175
+ ```html
176
+ <iframe src="/artwork/player.html" title="Generative artwork"
177
+ style="width:100%;height:600px;border:0"></iframe>
178
+ ```
179
+
180
+ Ordinary iframe embeds can cross origins. JavaScript controls through the
181
+ generated `embed.js` require the same origin. WebGPU requires a compatible
182
+ browser/device and HTTPS or localhost. Use `--asset assets/photo.png` for a
183
+ file whose path is computed in code; export never copies the whole project.
184
+
108
185
  Projects may also provide trusted, dockable Studio panels as plain TypeScript modules under `panels/`. These extensions remain outside graph documents and are never loaded by headless execution.
109
186
 
110
187
  ## Animation
@@ -152,7 +229,21 @@ Frames are written as `<out>/<node id>.<frame>.<ext>`, zero-padded to at least f
152
229
 
153
230
  Drawing offline goes through Skia rather than a browser. The optional `@napi-rs/canvas` supplies `OffscreenCanvas`, `Image`, `Path2D` and the rest as globals in the Node process, deliberately not `document`, since that is how a node detects its host. So a node that draws on an `OffscreenCanvas` needs no separate headless implementation, and the built-in `cascade.image.*` library rasterises through Skia in Node too, so a graph built from it renders headlessly with no browser involved. A run without the renderer installed still works for graphs that draw nothing, and says what is missing if a cook fails in a canvas-shaped way.
154
231
 
155
- `--frames` renders dynamic graphs. A definition-v1 graph runs through the deterministic runtime, which owns its own clock and has no parameter animation, and `cascade run` refuses the flag rather than rendering frame 1 a hundred times.
232
+ Compatible definition-v1 GPU nodes use optional Dawn instead. For a bounded
233
+ still render that a test or agent can consume:
234
+
235
+ ```bash
236
+ cascade check index.cascade
237
+ cascade run index.cascade --frames 1 --json --timeout 60000
238
+ ```
239
+
240
+ Check the exit code before parsing the success manifest on stdout, then inspect
241
+ the images listed in `files`; diagnostics go to stderr. Dawn does not make DOM,
242
+ WebGL or browser-only nodes portable, and pixel equality across GPU drivers is
243
+ not guaranteed. See [Headless WebGPU](doc/HEADLESS_GPU.md) for host requirements,
244
+ readback and testing guidance. Cascade does not upload these images to a model.
245
+
246
+ `--frames` works for an all-dynamic graph and for an all-definition-v1 graph. Definition-v1 runs resolve stored expressions and keyframe channels from the explicit `frame` and `fps` supplied to each deterministic run. A CLI graph that mixes the two node styles is rejected explicitly because there is not yet a bounded adapter between the execution engines.
156
247
 
157
248
  ## The agent console
158
249
 
@@ -219,7 +310,7 @@ host's executor, so the graph stays portable and contains no backend selector.
219
310
  This is the intended pattern for media transforms such as crop or resize; use
220
311
  shared parity tests to keep their outputs and metadata aligned.
221
312
 
222
- There is a second node style, and it is not deprecated. A **dynamic** module exports `execute(node, graph)` and declares its ports and parameters imperatively inside it, as `node.param('size', 1024, { min: 16, max: 4096 })`, running once for discovery and again on every cook. Studio cooks both styles and a Studio graph may mix them: it dispatches on what a compiled module exports, building a definition-v1 node's ports from its literal and calling `execute` with a real context, and calling a dynamic module as `execute(node, graph)`. `cascade run --frames` renders dynamic graphs, and the deterministic runtime cooks definition-v1 ones, which are what `cascade check` inspects statically. A malformed definition never falls back to dynamic execution — it is reported. A project's own `AGENTS.md`, written by `cascade new`, states which style that project expects.
313
+ There is a second node style, and it is not deprecated. A **dynamic** module exports `execute(node, graph)` and declares its ports and parameters imperatively inside it, as `node.param('size', 1024, { min: 16, max: 4096 })`, running once for discovery and again on every cook. Studio cooks both styles and a Studio graph may mix them through its compatibility controller. The CLI uses the deterministic runtime for an all-definition-v1 document and the compatibility engine for an all-dynamic document; it rejects a mixed document. `cascade check` requires definition-v1 modules because it inspects them statically. A malformed definition never falls back to dynamic execution — it is reported. A project's own `AGENTS.md`, written by `cascade new`, states which style that project expects.
223
314
 
224
315
  Provider integrations are project code, not Cascade infrastructure. A project
225
316
  can call a remote service from a Studio/browser node, invoke Python or an
@@ -262,11 +353,23 @@ cancellation, event subscriptions, output retrieval, and disposal. Hosts
262
353
  decide which capabilities exist; Cascade never silently moves a stage between
263
354
  browser and server.
264
355
 
265
- The same registration path exposes the initial `cascade.geo.*` library in
266
- Studio and headless hosts: `Rectangle`, `Circle`, `Transform`, `Merge`,
267
- `CopyToPoints`, and `SvgExport`. Their definitions, ports, and executors are
268
- owned by the runtime; Studio adapts those definitions instead of maintaining a
269
- second set of node algorithms.
356
+ The same definitions expose the initial `cascade.geo.*` library in Studio and
357
+ headless hosts: `Rectangle`, `Circle`, `Transform`, `Merge`, `CopyToPoints`,
358
+ and `SvgExport`. Their definitions, ports, and executors are runtime-owned;
359
+ Studio adapts them through its compatibility controller instead of maintaining
360
+ a second set of node algorithms.
361
+
362
+ ## Current capability boundaries
363
+
364
+ | Surface | Current status |
365
+ | --- | --- |
366
+ | Studio authoring | Supports dynamic and definition-v1 nodes in one document through the compatibility controller. |
367
+ | Headless CLI | Executes all-definition-v1 or all-dynamic documents; mixed documents are rejected. Both styles can render frame sequences. |
368
+ | Embedded runtime | `cascade/runtime` is the neutral definition-v1 API for Node and browser hosts. It does not load Studio or interpret dynamic nodes. |
369
+ | Static browser player | `cascade build` exports definition-v1 browser/portable graphs with assets and optional browser WebGPU. No server operations, dynamic modules or project Studio panels. Same-origin JavaScript controls; ordinary cross-origin iframe embeds. |
370
+ | GPU | Studio and the optional Dawn CLI host provide a shared device, adapter metadata, limits, and per-node caches. Portable GPU nodes render offscreen and explicitly read RGBA8 pixels through `cascade/gpu`; graph ports still carry images. See [headless GPU rendering](doc/HEADLESS_GPU.md). |
371
+ | Studio HTML export | The older Studio exporter uses a separate minimal runtime and supports only a subset of graph behavior. Use `cascade build` for supported definition-v1 web deployment. |
372
+ | External services | Project-owned and optional. Cascade itself requires no paid provider or model subscription. |
270
373
 
271
374
  ## Repository map
272
375
 
@@ -276,12 +379,14 @@ packages/runtime/ environment-neutral graph runtime and adapters
276
379
  src/editor/ optional Svelte Studio, including the timeline and agent panels
277
380
  src/nodes/ current class-based built-in node libraries (core, geo, image)
278
381
  src/engine/ current compatibility services
279
- src/cli/ the `cascade` command: new, validate, check, inspect, run, Studio
382
+ src/cli/ the `cascade` command: new, validate, check, inspect, run, build, Studio
383
+ src/player/ standalone browser host and iframe controls
280
384
  server/ project-scoped Node host and transports, including the agent session host
281
385
  scripts/ package build, node-reference generation, and release verification tooling
282
386
  tests/ behavior, workflow, security, and performance tests
283
387
  spec/ accepted feature specifications
284
388
  doc/ authoring guides and implementation plans
389
+ site/ static documentation at cascade.field.io
285
390
  ```
286
391
 
287
392
  The root `cascade` package is the distribution and CLI owner. The two internal workspaces define architectural boundaries; they are not independently published until independent versioning or external consumption requires it.
@@ -320,6 +425,8 @@ trusted-host session; an untrusted remote bind does not expose them.
320
425
  - [Node reference](doc/NODE_REFERENCE.md) — every built-in node and its declared ports, generated from the definitions
321
426
  - [Design source of truth](DESIGN.md)
322
427
  - [Architecture](ARCHITECTURE.md)
428
+ - [Browser player](doc/WEB_PLAYER.md)
429
+ - [September quality review and sketch verification](doc/QUALITY_REVIEW_2026-09.md)
323
430
  - [Subnet and shell specification](spec/CASCADE_SUBNET_AND_SHELL_SPEC.md)
324
431
 
325
432
  Inspired by Nodes.io, SideFX Houdini, TouchDesigner, Maya, Cinder, openFrameworks, and Processing.