Use when editing the Tiny World Builder repo, especially tiny-world-builder.html, to preserve the static classic-script Three.js r185 app structure and local edit/reload workflow.
68
81%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Work mainly in tiny-world-builder.html; also update index.html, vendor/three/, publish.sh, checks, docs, or skills when a change affects those durable contracts.
Core rules:
index.html is a static landing page entry point; the builder remains available at /tiny-world-builder and /tiny-world-builder.html.random-island-preview.html is a standalone local-dev control shell for random-island reveal/card iteration. It embeds /tiny-world-builder?randomIslandPreview=1 so the visible island is the real Three.js game renderer, then talks to the app by postMessage to generate, load, and export reveal/game JSON. Production Netlify shares it through the private netlify/functions/random-island-preview.mjs route instead of copying the HTML as a public static file.tiny-world-builder BACKUP.html if present.// -------- tools --------.setCell(x, z, opts), not direct world[x][z] writes outside initialization.vendor/three/; do not reintroduce CDN runtime scripts. The app consumes vendor/three/tinyworld-three.r185.min.js, a generated classic-global bundle made from three@0.185.0; regenerate it with npm run vendor:three after changing three or loader wiring.tiny-world-builder / dist/LandscapeEngine.js line numbers after source edits, run npm run build so dist/index.html, dist/tiny-world-builder.html, and dist/LandscapeEngine.js are regenerated before judging the runtime.tools/dev-server.js (never written into the committed HTML or dist/). The
assets live under gitignored cluso/ and publish.sh excludes that dir, so
tools/check.js / tools/smoke-static.js (which scan the shipped HTML) stay
green. Do NOT add cluso/cluso-embed.{js,css} references to
tiny-world-builder.html or any committed/shipped HTML — production must never
load it. (Owner-approved override of the prior "no Cluso, even local" rule.)M.* must not be mutated per instance; clone first for unique opacity/material behavior and dispose cloned materials in disposeGroup.Validation:
npm test (syntax-checks the inline app script, parses world.schema.json, verifies embedded schema parity, checks local script/link assets, and runs the no-browser smoke guard).perl -0ne 'print $1 if m#<script>\s*(.*?)\s*</script>#s' tiny-world-builder.html | node --check.http://localhost:3000/tiny-world-builder.<script> gotcha (has burned us twice)tools/check.js extracts the main app script with this regex:
html.match(/<script>([\s\S]*?)<\/script>\s*<\/body>/);It greedily matches from the first plain <script> through to the last
</script></body>. If you add another inline <script> block above the main
app (e.g. a defaults bootstrap), it MUST carry an HTML attribute or check.js
conflates the two scripts plus the literal </script><script> separator into
one parse target and throws Unexpected token '<'.
<script id="my-bootstrap">...</script> <!-- ✓ regex skips this -->
<script>...</script> <!-- ✗ becomes part of main app -->For persisted runtime state (defaults pipeline, audio, camera, panel
positions, feature flags) see .codex/skills/tinyworld-runtime-state.
For island layout, sponsor banner, plane/crop-duster flight paths see
.codex/skills/tinyworld-island-and-planes.
f21f84b
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.