plugins/lisa-phaser-cursor/skills/phaser-asset-sourcing/SKILL.md
This skill should be used when a Phaser 4 game needs actual art or audio and none exists yet — deciding WHERE game art comes from before it can be packed. Covers the priority order (curated CC0 packs → deriving/editing CC0 art → asking the human for bespoke/paid work), the strict license gate (CC0-or-equivalent only, recorded with an exact license quote + evidence URL in assets/LICENSES.md), the provenance requirement (a committed ingest script or committed raw sources), why procedural generateTexture placeholders are tracked art debt and never a best practice, and the expectation that characters ship real idle+walk animation. Use it BEFORE phaser-asset-pipeline (which only packs art that already exists). Pairs with phaser-asset-pipeline, the official animations skill, and the art-director / audio-director personas.
npx skillsauth add codyswanngt/lisa phaser-asset-sourcingInstall 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.
The phaser-asset-pipeline skill is packing-only: it assumes raw art already
sits in assets/src and turns it into atlases + typed keys. It never says where
that art comes from. Left to fill the gap, agents reach for the path of least
resistance — this.add.graphics().generateTexture(...) white rectangles — and
ship a wireframe that typechecks and boots but looks like programmer art.
Procedural placeholders are art debt, not an art strategy. A shipped game
needs real, licensed, cohesive assets. This skill is the missing step: how to
get the art before you pack it. Read it before phaser-asset-pipeline.
Work top-down. Only fall to the next tier when the one above genuinely can't serve the need.
Real, cohesive, commercially-usable art exists for free under CC0. These are the recommended starting points; all are CC0 or CC0-equivalent (verify per pack — see the license gate below):
CC0 in the license facet). Great breadth; licenses are per-submission, so
you MUST verify each asset individually — OGA also hosts CC-BY, CC-BY-SA, and
GPL art that the license gate rejects.Prefer one or two packs with a shared visual language over a magpie mix — a single Kenney pack reads more cohesive than ten sources stitched together (the art-director persona will flag the mismatch otherwise).
CC0 waives all rights, so you may recolor, crop, re-slice, retag, upscale (nearest-neighbor for pixel art), and recombine freely. This is usually how a pack becomes this game's assets: slice a sprite sheet into per-frame PNGs, rename frames to your content refs, restitch strips. Record exactly how in the ingest script (below) so the derivation is reproducible.
When the art bible demands a bespoke look no CC0 pack delivers — a signature character, a specific illustrated style, licensed audio — stop and ask the human. Do not silently downgrade to placeholders and do not buy/commission on your own. Surface the decision:
"The art direction calls for
<X>. No CC0 source covers it. Options: (a) adapt the closest CC0 pack<Y>and accept the style delta, (b) you provide/approve a paid pack or commission, (c) ship a trackedgenerateTextureplaceholder against issue#NNNuntil real art lands. Which?"
Paid assets, CC-BY with attribution, or any non-CC0 license are allowed only
with explicit human approval, recorded in assets/LICENSES.md with the terms.
assets/LICENSES.md: the pack name, author,
source URL, the exact license, a verbatim license quote, and the
evidence URL where that quote lives (the itch page, the in-pack
LICENSE.txt, the OGA submission). "It looked free" is not evidence.| Pack | Author | Source | License | Evidence |
|------|--------|--------|---------|----------|
| Ninja Adventure – Asset Pack | Pixel-boy & AAA | https://pixel-boy.itch.io/ninja-adventure-asset-pack | CC0 1.0 | In-pack `LICENSE.txt` (full CC0 text); itch page "Creative Commons Zero v1.0 Universal" |
The packs themselves are often large and need not be committed, but how you
got from a pack to assets/src must be. Two acceptable patterns:
scripts/ingest-assets.mjs) that records, per
frame, which pack / file / cell it came from and re-slices deterministically.
Re-running it against a fresh download reproduces assets/src byte-for-byte.
This is the provenance record — it documents the source layout (e.g. "Ninja
Adventure character Idle.png is 64×16 = 4 direction cells; Walk.png is
64×64 = 4 direction columns × 4 walk rows") and doubles as the derivation log.assets/src directly, when the art is small,
hand-authored, or already per-frame.Either way: assets/LICENSES.md + a reproducible path from source to
assets/src. Adding art from a new source requires both, every time.
generateTexture placeholders are TRACKED ART DEBTA scene MAY ship generateTexture / graphics-drawn placeholder art only
when it is tracked by a linked art-debt issue. It is never the finished state,
and it is never described as a best practice. In particular:
LEGACY_GENERATED_TEXTURE_KEYS map
in the pack script, or a checklist in the issue) and delete each entry the
moment the real asset lands.Static single-frame sprites are a placeholder smell. A character/creature ships
at minimum an idle and a walk cycle; most CC0 character packs already
provide directional idle/walk/attack strips, so there is no excuse to ship a
frozen frame. Name frames so the pipeline and the official animations
skill can build the animation from them (e.g. <ref>/walk-<dir>-<n>), and drive
them with anims.create / anims.play, not a static texture. The asset-pipeline
skill covers frame naming; the official animations skill covers playback.
assets/LICENSES.md is CC0-or-equivalent (or human-approved
with terms recorded) and carries a verbatim quote + evidence URL.assets/src is reproducible from a committed ingest script or is itself
committed raw source.generateTexture placeholder art without a linked art-debt
issue; the debt ledger matches reality.Once the art exists in assets/src, hand off to phaser-asset-pipeline to
pack it and codegen the typed keys.
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.