diff --git a/API.md b/API.md index 3d8b395..f98709e 100644 --- a/API.md +++ b/API.md @@ -16,6 +16,8 @@ All routes go through `api/index.php?r=…` (the site's nginx does not pass `PAT | GET | `sounds` | `[{file,name,bytes,updatedAt}]` — what the sound picker offers | | POST | `sounds&name=jump.wav` | **raw sound bytes** → `{file,name,bytes}` (201) | | DELETE | `sounds/{file}` | 204 | +| GET | `plugins` | `[{file,bytes,updatedAt}]` — every `.js` in `data/plugins/`, sorted by file name | +| GET | `plugins/{file}` | the module source as `text/javascript` (`nosniff`, `no-cache`); 404 for anything but a bare file name there — see [Plugins](Plugins) | Every project document carries `formatVersion` (`PROJECT_FORMAT_VERSION` in `core/model/Project.ts`, currently 2). There are no load-time migrations: `serialize.ts` reads what it recognises and drops diff --git a/Architecture.md b/Architecture.md index 10fceee..36f8f0a 100644 --- a/Architecture.md +++ b/Architecture.md @@ -88,7 +88,8 @@ src/editor/ App → Editor (layout + ticker), PlaySession (the run), fileImport (drop/paste) → assetImport (one upload pipeline, an ImportKind per sort) ← textureImport / fontImport / soundImport, FilePicker (the shared "+ → Texture / Font / Sound" dialog; ImagePicker/FontPicker/SoundPicker only describe their row), framing (fit/marquee/snap maths), FormDialog (the small modal forms: label column, Cancel + confirm, one open at a time), AssetTabEditor (the shared shell of the asset tabs), - TabStrip + tabRow (the tab row and what it does when the tabs outgrow it) + TabStrip + tabRow (the tab row and what it does when the tabs outgrow it; plugin tabs are appended at run time) +src/editor/plugins/ startPlugins (list, import, host) → loader (order, checks, what became of each file), pluginApi (API v1), NodeBoard (api.ui) src/editor/viewport/ WorldViewport base → FreeViewport (a camera of its own: fit, pan, wheel zoom) → SceneViewport, PreviewCanvas; GameViewport follows the game's camera instead — editing tools, hence not in src/viewport/ src/editor/inspector/ Inspector panel, host (what a section builds into), field factory, previewHandlers (scrub → preview → command), valueSpecs @@ -96,7 +97,7 @@ src/editor/inspector/ Inspector panel, host (what a section builds into), field one section per selection kind (asset/object/node/frame), variableRows (one row shape for every variable), portSection, aspectAction, objectQueries/vectorRows/parentRow src/editor/panels/ AssetPanel, assetMenu (the two groups of the + menu), HierarchyPanel, Toolbar -src/editor/graph/ GraphEditor (header + picker), GraphCanvas, EdgeLayer (curves and fold marks), graphMenus, +src/editor/graph/ GraphEditor (header + picker), GraphCanvas, graphView (zoom limits, grid, wheel zoom – shared with NodeBoard), EdgeLayer (curves and fold marks), graphMenus, NodeView, NodePalette + paletteEntries (which also ranks a search), folding (hidden links, collapsed nodes), Breadcrumb + trail (the path into nested behaviors), beads (the run's pulses), AnnotationView + annotationDrag (groups and comments: what a drag carries, each thing moved once) src/editor/container/ ContainerEditor (header + picker), ContainerCanvas (a SceneViewport on a template) @@ -110,8 +111,9 @@ src/editor/particles/ ParticlesEditor (graph canvas left of a preview panel, sp ParticlePreview (the panel: the asset's own particles, wearing its own rows) src/editor/list/ ListEditor (a row per item), slot (which list is being edited, and how it is written back) src/editor/console/ log (ring buffer, argument formatting, the console.* capture), ConsolePanel (the tail under the tabs) -api/ PHP backend: index.php (routing), lib/{Store,TextureStore,FontStore,SoundStore,OriginalName,Response}.php - data/projects/ persisted projects, data/textures/ + data/fonts/ + data/sounds/ content-addressed uploads +api/ PHP backend: index.php (routing), lib/{Store,TextureStore,FontStore,SoundStore,PluginStore,OriginalName,Response}.php + data/projects/ persisted projects, data/textures/ + data/fonts/ + data/sounds/ content-addressed uploads, + data/plugins/ editor plugins (filled from plugins/ by the build and the seeder) tests/ Vitest unit tests tools/ seed-*, e2e (steps in tools/e2e/, rig in tools/e2e/lib/), smoke-*, lib/, assets/ (the walk demo's sheet) ``` diff --git a/Development.md b/Development.md index 627703a..7f2393a 100644 --- a/Development.md +++ b/Development.md @@ -12,7 +12,7 @@ npm run check # typecheck + lint + format:check + tests, the gate CI runs # code is lost (tail's is reported), so a red run reads as green npm run build # writes dist/ and regenerates index.html ./build.sh # the same under `set -o pipefail`, for callers that pipe the output -node tools/seed-e2e.mjs && node tools/e2e.mjs # 948 editor checks, screenshots in /tmp/gm-e2e-*.png +node tools/seed-e2e.mjs && node tools/e2e.mjs # 963 editor checks, screenshots in /tmp/gm-e2e-*.png GM_STEPS=20 node tools/e2e.mjs # or 1-12, or 6,20 — a subset while working on one step ./e2e.sh start [GM_STEPS] # the same run detached, see below ./e2e.sh status # live progress, or the last run's result @@ -64,7 +64,7 @@ The e2e run is a list of steps in `tools/e2e/` (hierarchy, inspector, play, asse graph, parenting, colliders, containers, text/enabled, menus, textures, frames, overflow, aspect, container tab, run-in-editor, pause, nested behaviors, key repeat, list tab, struct variable, variable nodes, property nodes, animations, state machines, console, shaders, transforms, fonts, -particles, shared scope, render on change, sounds, load scene, graph groups, nine-slice) that build on each other's +particles, shared scope, render on change, sounds, load scene, graph groups, nine-slice, plugins) that build on each other's scene state and share the CDP driver in `tools/lib/harness.mjs` — `press`, `undo`, `play`, `object(id)`, `world()`, `mutate(js)` and friends, so a check reads like the interaction it exercises. @@ -232,4 +232,4 @@ widths to find click points. The **render device is not in this repo** — `/dev and a 1 GB `/dev/shm` come from `container.options` in the runner's own `config.yaml`, which applies to every job on that runner. Without them chromium falls back to llvmpipe, which gets WebGL 1.0 only. Measured in the job container: `ANGLE (Intel, Vulkan 1.3.230, HD Graphics 630)`, -WebGL 2.0, and the same 948 checks as here. +WebGL 2.0, and the same 963 checks as here. diff --git a/Home.md b/Home.md index 260a856..25d5dba 100644 --- a/Home.md +++ b/Home.md @@ -31,6 +31,7 @@ Live: · Widget playground: