Skills
A skill is a folder in templates/crescent-game/.claude/skills/ with a SKILL.md: a short front matter (name, description) and the instructions for one job. Claude Code matches a task to a skill by its description and loads only that one. Other agents can read the file directly. Some skills have reference files next to SKILL.md.
The template has 24 skills. Start with game-router for any new game or change of genre; it names the next skill to read.
Skills marked hosted were written for the Moonspell app's worker and use tools that do not exist outside it. What to do instead is on Claude Code and other agents.
Routing and design
| Skill | What it is for | Load it when | What it produces |
|---|---|---|---|
game-router | Maps the player's words to a genre and a route: a module config, an example to copy, or from scratch, with the camera, controls, bots and online defaults for that genre and what is not possible yet. | First, for any request that creates a game or changes what kind of game it is. | A route (module:racing, foundation:character, kit:turns, scratch...) written as one line in the commit message. See Game router. |
crescent-game-change | The procedure for any change: read GDD.md, route, read before writing, the smallest change that does what was asked, game UI, phone rules, verify, commit. | Every task in a game repo. | A checked, committed change. Its verify step uses crescent export; outside the app use npm run export:web. |
game-design-doc | Creates, reads and grows GDD.md: pitch, pillars, controls, a table of dynamics (trigger, move, camera, world, sound), rules, assets. Also how to read a reference video into moments with ffmpeg. Reference file: gdd-template.md. | Start of every task; whenever someone gives a reference video, image or game to match. | GDD.md at the repo root, updated in the same commit as the code. See GDD.md and playtest.json. |
Genres
| Skill | What it is for | Load it when | What it produces |
|---|---|---|---|
car-race-game | Vibe words to a defineRaceGame config: time of day, scenery, track preset or custom points, car tuning, opponents, post-processing look. | The game is or becomes a car race (module:racing). | A race config in src/game/index.tsx. See Racing. |
shooter-game | Words to a defineShooterGame config: mode (ffa, tdm, gun-game, ctf, koth), map, loadout, bots, pickups, multiplayer. | The router picks module:shooter. | A shooter config, started from examples/flag-rush/, plus the <id>-kills board for the backend. See Arena shooter. |
puzzle-game | Words to a definePuzzleGame config: pack (block, merge, match, sort), mode, difficulty, theme, drawn tiles, sounds. | The router picks module:puzzle, and every change to a puzzle game. | A puzzle config from examples/moon-blocks/ or examples/moonrise/. See Puzzle. |
kingdom-game | Words to a defineKingdomGame config: theme, buildings on timers, crops, hero classes, missions, and the required story chapters. | The router picks module:kingdom, and every change to a kingdom game. | A kingdom config from examples/oath-of-ashvale/, plus model and cut-out lists. See Kingdom. |
character-game | Words to a level, character params, camera, touch controls, bots and weapons on the character foundation: parkour, arena, tag, stealth, horror, top-down, side-view, melee. | The router picks foundation:character. | A game copied from examples/rooftop-hop/, examples/lantern-tag/ or examples/pulse-arena/ and changed. See Character and cameras. |
platformer-2d | Flat 2D platformers, side-scrollers, runners and top-down games on the 2D layer: tile maps from strings, the platformer and top-down controllers, triggers, parallax, animated sprites. | A side-scrolling run-and-jump game, a 2D dungeon or maze. | A game started from examples/sky-runner/. See 2D layer. |
Engine pieces
| Skill | What it is for | Load it when | What it produces |
|---|---|---|---|
touch-controls | The multi-touch rules every control follows: one gesture tracks every finger, no separate Pressables for buttons held together, no window coordinates. Also <CharacterControls secondThumb />. | Adding or changing any control or HUD button. | Controls that take several fingers at once. See Input. |
game-ui | Screens, look and feel: the screen set (title, HUD, pause, results), palette and shapes from the game's theme, one font family from the genre picker, SF Symbol icons through <Icon> (never emoji), juice. Reference file: juice.md (button, banner, counters, results, coin fly). | Every new game, and any screen, menu, HUD element, button, banner or reward. | UI that matches the game, checked against its "Before you save a checkpoint" list. See HUD and UI. |
expo-animation | Sub-skill of game-ui: how to build any React Native animation (should it animate, which thread, which properties, spring or timing, haptics, reduced motion) with Reanimated 4 and Gesture Handler. Vendored from expo/skills under MIT (LICENSE); a block at the top adapts it to games. Reference file: RECIPES.md. | Writing animation code for menus, HUD pieces, panels or drags, or when motion stutters. | Animations on the UI thread using the engine's motion constants. |
game-feel | 3D moments: shake, hitStop, slowMotion, flash, squash, stretch, pop, vanish, tweens and the juice() presets under <GameFeel> and <FeelOverlay>. | Hits, landings, pickups, explosions, deaths, or a game that "feels flat" in 3D. | Juice in the scene. See Game feel. |
gpu-effects | TypeGPU particles (fire, sparks, smoke, magic, rain, snow, dust, vortex), trails, and your own compute shaders on three's device. | Fire, explosions, magic, weather, exhaust, bursts, or thousands of moving things. | <Particles> and compute code. See GPU effects. |
physics | Rigid bodies on cannon-es for the few objects that matter, GPU debris for the many small ones, triggers, joints, <Vehicle>, with a budget and when to leave physics off. | Things that are knocked over, thrown, dropped, rolled, swung, scattered or picked up. | <Physics> with bodies. See Physics. |
saves | Progress players come back to: defineSave, defineProgression (currencies, shop, unlocks, XP, daily streaks, offline earnings), useSettings, <ScoreCard>, and how to test migrations. | The game keeps anything between sessions, or the player asks for a shop, upgrades, levels, daily rewards or a settings screen. | An engine save that syncs once a backend exists. See Saves and Saves sync. |
native-now-modules | Every native module compiled into the Moonspell app, by category, with exact versions. Reference file: references/modules.md. Hosted: written for the prebuilt shell (crescent catalog, crescent doctor). | Choosing a library, or before adding any dependency. | A library choice from the pinned set. |
Art and audio
| Skill | What it is for | Load it when | What it produces |
|---|---|---|---|
models | 3D models for characters, vehicles, buildings and props, used through <Model>, CharacterMesh model= and <Scenery> with a fallback; prompts that rig well; the budget. Hosted: the files are generated after the agent's pass from ~/.crescent/models.json. | A specific look (a knight, a red kart, a street of buildings), or capsules and boxes that should become real shapes. | Fallback-first model code and a model list. See Models and scenery. |
sprites | 2D art: character sheets, items, tilesets, backgrounds and parallax layers, used through createSheet with your shapes as the fallback. Hosted: drawn after the pass from ~/.crescent/sprites.json. | A 2D game that should look like more than flat shapes, or a named look (pixel art, a cute fox). | Sheet code with fallbacks and a sprite list. |
cutout-art | Cut-out items in a pre-rendered 3D look (resource icons, rewards, build cards, portraits, crops) used through <SheetImage> in the HUD and <Billboard> in the scene. Hosted: drawn after the pass from a cutouts entry in ~/.crescent/sprites.json. | Item pictures or story portraits instead of icons. | Cell-indexed art with fallbacks. |
sound-design | The whole sound of a game: list every sound from the GDD's dynamics (body, reactions, rewards, air, music), write prompts, clean files with ffmpeg, wire them through useAudioMixer. Generation is hosted (Seed Audio for .wav, Sonilo for .m4a, after the pass). | Every new game, every new move or moment, and any request for music, effects or ambience. | A sound plan in GDD.md and mixer wiring. See Audio. |
Backend
| Skill | What it is for | Load it when | What it produces |
|---|---|---|---|
realtime-backend | The game's Cloudflare Worker: live leaderboards, presence, multiplayer rooms joined from a link, ghosts and spectating, synced saves, the computer opponent (POST /ai/turn), and anything that should outlive the phone. Includes the scaffold in scaffold/backend/ and its CLAUDE.md. Its setup steps are hosted (a gateway and MCP tools); the scaffold and client code are not. | Any online, shared, multiplayer, high-score or AI-character request, and any change to backend/ or src/engine/net. | backend/ copied from the scaffold, BOARDS filled in, GAME_BACKEND_URL set. See Backend. |
Testing and shipping
| Skill | What it is for | Load it when | What it produces |
|---|---|---|---|
playtest | Writes and keeps playtest.json, a script of real touches (press, hold, tap, drag, expect, expectChange, mark, repeat). Hosted: the Moonspell pipeline runs it on a simulator and its recording becomes the game's feed video. | Every new game, and whenever screens, button labels or controls change. | playtest.json at the repo root. See GDD.md and playtest.json. |
push-to-device | crescent push: re-export and send the bundle live to a connected Moonspell app, and read its exit codes. Hosted only. | A person developing with a Moonspell app connected to a local crescent start server. | Nothing outside the Moonspell app: run npm run web or a development build instead. |
Adding a skill
A skill for a new genre module also needs a row in the game-router skill (trigger words in Classify, a row in Route, the limit removed from section 3) and a line in the template's CLAUDE.md skills list. See Writing a module.