plugins/src/phaser/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.
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.