plugins/lisa-phaser/skills/phaser-project-structure/SKILL.md
This skill should be used when creating, restructuring, or reasoning about a Phaser 4 game project — the game config, the Vite + TypeScript layout, the Boot → Preloader → MainMenu → Game scene flow, scale/resolution setup for desktop and mobile, and where code and assets belong. Use it before scaffolding a project, adding a major subsystem, or deciding where a file should live. Pairs with the official scenes skill, the official loading-assets skill, the official filters-and-postfx skill, and phaser-testing.
npx skillsauth add codyswanngt/lisa phaser-project-structureInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This stack targets Phaser 4 (v4.2+, npm package phaser@^4.2.0), built
with Vite + TypeScript — the layout the official phaserjs/template-vite-ts
template and npm create @phaserjs/game@latest scaffold. Phaser 4 ships its own
type definitions (types/phaser.d.ts); do not add @types/phaser.
| Path | Role |
| --- | --- |
| index.html | Single page that loads src/main.ts; owns the game container div |
| src/main.ts | Game config + new Phaser.Game(config) — the only bootstrap file |
| src/scenes/ | One scene class per file (Boot.ts, Preloader.ts, MainMenu.ts, Game.ts, …) |
| src/logic/ | Pure TypeScript game logic — no phaser imports (testable) |
| src/assets.ts | Typed asset-key constants (texture, audio, anim, scene keys) |
| public/assets/ | Static assets served by Vite (atlases, audio, packs) — never imported |
| tests/ | Vitest unit tests for src/logic/** and pure helpers |
| dist/ | Vite build output — generated, never edited or committed |
One config object in src/main.ts. The opinionated baseline:
const config: Phaser.Types.Core.GameConfig = {
type: Phaser.AUTO, // WebGL; Canvas renderer is deprecated in v4
width: 1280,
height: 720,
parent: "game-container",
backgroundColor: "#028af8",
scale: {
mode: Phaser.Scale.FIT,
autoCenter: Phaser.Scale.CENTER_BOTH,
},
physics: {
default: "arcade",
arcade: { gravity: { x: 0, y: 0 }, debug: false }, // fixedStep defaults to true in v4 — keep it
},
scene: [Boot, Preloader, MainMenu, Game],
};
v4-specific config facts:
roundPixels now defaults to false (v3 defaulted true). Leave it — the
new default prevents flicker on rotated/scaled objects.pixelArt: true (nearest-neighbor + roundPixels), or the new
render.smoothPixelArt: true (WebGL-only) for pixel art that rotates or
scales smoothly. Pick one per project and record the choice.render.renderNodes — see the official filters-and-postfx skill.Phaser.HEADLESS exists for logic-only boots (tests) — see [[phaser-testing]].Four-stage boot, in order (see the official scenes skill for lifecycle detail):
loading-assets skill), then starts MainMenu.HUD, Pause run in parallel) — gameplay.src/; bun run dev (vite), bun run build
(vite build), bun run preview serve and package it.src/logic/ as pure functions/classes so Vitest can run them without
a browser.src/assets.ts constants — a typo in an inline string
key fails at runtime only; a typo in a constant fails at compile time.Phaser.Math.RND (or a local RandomDataGenerator) from a
single place; never Math.random() in game code.A structural change is verified when bun run typecheck, bun run test, and
bun run build pass AND the game boots: bun run dev, open the page, confirm
the canvas renders past the Preloader with no console errors.
development
Prepare a machine — a fresh laptop or a throwaway container — to run coding agents, before any repository exists. Detects which of Lisa's supported agents (Claude Code, Codex, Cursor, OpenCode, Antigravity, Copilot) are already installed, asks which credential manager the machine uses (Bitwarden, 1Password, Doppler, Vault, AWS, or none), and installs only what is missing, each by its vendor's own preferred method. Idempotent, headless by default, and emits a Dockerfile for a spin-up/spin-down environment. Run it on a new machine, in a container, or before cloning anything.
tools
Provision and verify a remote execution environment for a host project — Codex Cloud today, other remote surfaces as they are added. Generates a repository-owned setup script that installs the declared toolchain, materializes secrets through lisa-secrets-access, and runs the project's own hook. Provisions by API where one exists, by driving the vendor console where one does not, and by emitting exact config otherwise — then proves the result with the same read-back regardless of which tier did the work. Use before dispatching any work with executionEnv.
tools
Bring a developer's machine in line with the toolchain the project declares. Reports every tool in remoteEnv.tools that is missing, outdated, or unpinned for this platform, and installs the missing ones into ~/.local/bin from the same pinned, checksummed entries the remote surfaces use — but only when asked. Same manifest, same pins, same installers as lisa-setup-remote-env; what differs is consent and that the pin is a floor rather than an equality. Run it on a fresh checkout, after a manifest change, or when a tool fails at the moment of use.
tools
Route one unit of work to a remote execution surface. Reads the executionEnv parameter (local by default, codex-cloud or claude-web today), verifies the environment is provisioned and bound to this repository, submits a thin skill invocation, records the task identifier to .lisa/remote-dispatch.json, and exits without polling. Routing only — the remote runs the identical skill from the identical repository. Composable and inline: other skills invoke it via the Skill tool rather than users calling it directly.