Game Asset Generator
htdt/godogen
Generates game art from text prompts: PNG images, GLB 3D models, rigged characters, animations and sprites, with background removal.
A skill your agent uses when creating or controlling sprite animations in Phaser 4.
$ npx skills add autonomous-ai/openharness --skill animations -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install autonomous-ai/openharness animations --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/autonomous-ai/openharness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/store/agents/phaser/skills/animations .claude/skills/animations && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "animations" agent skill from https://github.com/autonomous-ai/openharness/tree/main/store/agents/phaser/skills/animations into .claude/skills/animations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "animations", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/autonomous-ai/openharness/tree/main/store/agents/phaser/skills/animationsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add autonomous-ai/openharness --skill animations -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install autonomous-ai/openharness animations --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/autonomous-ai/openharness.git skills-src && mkdir -p .agents/skills && cp -r skills-src/store/agents/phaser/skills/animations .agents/skills/animations && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "animations" agent skill from https://github.com/autonomous-ai/openharness/tree/main/store/agents/phaser/skills/animations into .agents/skills/animations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "animations", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add autonomous-ai/openharness --skill animations -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install autonomous-ai/openharness animations --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/autonomous-ai/openharness.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/store/agents/phaser/skills/animations .cursor/skills/animations && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "animations" agent skill from https://github.com/autonomous-ai/openharness/tree/main/store/agents/phaser/skills/animations into .cursor/skills/animations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "animations", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/autonomous-ai/openharness.git --path store/agents/phaser/skills/animations--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add autonomous-ai/openharness --skill animations -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install autonomous-ai/openharness animations --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/autonomous-ai/openharness.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/store/agents/phaser/skills/animations .gemini/skills/animations && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "animations" agent skill from https://github.com/autonomous-ai/openharness/tree/main/store/agents/phaser/skills/animations into .gemini/skills/animations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "animations", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install autonomous-ai/openharness animationsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add autonomous-ai/openharness --skill animations -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/autonomous-ai/openharness.git skills-src && mkdir -p .github/skills && cp -r skills-src/store/agents/phaser/skills/animations .github/skills/animations && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "animations" agent skill from https://github.com/autonomous-ai/openharness/tree/main/store/agents/phaser/skills/animations into .github/skills/animations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "animations", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add autonomous-ai/openharness --skill animations -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install autonomous-ai/openharness animations --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/autonomous-ai/openharness.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/store/agents/phaser/skills/animations .opencode/skills/animations && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "animations" agent skill from https://github.com/autonomous-ai/openharness/tree/main/store/agents/phaser/skills/animations into .opencode/skills/animations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "animations", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
animationsA skill your agent uses when creating or controlling sprite animations in Phaser 4.
Animations is an agent skill from autonomous-ai/openharness. Use this skill when creating or controlling sprite animations in Phaser 4. Covers spritesheets, atlases, AnimationManager, AnimationState, play/stop/chain, frame callbacks, and animation events. Triggers on: sprite animation, spritesheet, play animation, animation frames.
Its SKILL.md is about 4.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Game Development, covering Sprites and pixel art. The repository describes itself as: The ultimate harness for coding agents and beyond. All your agents. All your machines. One command center. Start with code, then follow your curiosity and build across… The licence is MIT.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 50da5db. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are javascript).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Animations loads about 4.5k tokens when it runs. Until then it costs about 71 tokens; SKILL.md has 1,252 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from autonomous-ai/openharness at commit 50da5db, republished under its MIT licence (© autonomous-ai). 1,252 words, ~4,473 tokens.
.claude/skills/animations/SKILL.md (or your agent's skills folder).AnimationManager (global), AnimationState (per-sprite), creating animations from spritesheets and atlases, playing/pausing/chaining, animation events, frame callbacks.
Related skills: ../sprites-and-images/SKILL.md, ../loading-assets/SKILL.md
// In preload -- load a spritesheet
this.load.spritesheet('explosion', 'explosion.png', {
frameWidth: 64,
frameHeight: 64
});
// In create -- define a global animation
this.anims.create({
key: 'explode',
frames: this.anims.generateFrameNumbers('explosion', { start: 0, end: 11 }),
frameRate: 24,
repeat: 0
});
// Play it on a sprite
const sprite = this.add.sprite(400, 300, 'explosion');
sprite.play('explode');Phaser has two distinct animation objects:
| Aspect | AnimationManager | AnimationState |
|---|---|---|
| Access | this.anims (in a Scene) or this.game.anims | sprite.anims |
| Scope | Global -- shared across all scenes | Per-sprite instance |
| Purpose | Create/store animation definitions | Control playback on one Game Object |
| Class | Phaser.Animations.AnimationManager | Phaser.Animations.AnimationState |
The AnimationManager is a singleton owned by the Game. Animations registered there are available in every Scene. The AnimationState lives on each Sprite and handles playback for that specific object.
An Animation is a sequence of AnimationFrame objects plus timing data. Created via this.anims.create(config) (global) or sprite.anims.create(config) (local to one sprite).
When sprite.anims.play(key) is called, it first checks for a local animation with that key, then falls back to the global AnimationManager. Use local for sprite-specific animations; use global when shared across sprites.
// Global animation -- available to all sprites
this.anims.create({ key: 'walk', frames: 'player_walk', frameRate: 12, repeat: -1 });
// Local animation -- only on this sprite
sprite.anims.create({ key: 'walk', frames: 'npc_walk', frameRate: 10, repeat: -1 });
// This plays the LOCAL version because local takes priority
sprite.play('walk');Use generateFrameNumbers for spritesheets (numeric frame indices).
this.load.spritesheet('dude', 'dude.png', { frameWidth: 32, frameHeight: 48 });
// All frames
this.anims.create({
key: 'run',
frames: this.anims.generateFrameNumbers('dude', { start: 0, end: 7 }),
frameRate: 10,
repeat: -1
});
// Custom frame sequence
this.anims.create({
key: 'idle',
frames: this.anims.generateFrameNumbers('dude', { frames: [0, 1, 2, 1] }),
frameRate: 6,
repeat: -1
});generateFrameNumbers config:
start (default 0) -- first frame indexend (default -1, meaning last frame) -- final frame indexfirst -- a single frame to prepend before the rangeframes -- explicit array of frame indices (overrides start/end)Use generateFrameNames for texture atlases (string-based frame names).
this.load.atlas('gems', 'gems.png', 'gems.json');
this.anims.create({
key: 'ruby_sparkle',
frames: this.anims.generateFrameNames('gems', {
prefix: 'ruby_',
start: 1,
end: 6,
zeroPad: 4 // produces ruby_0001 through ruby_0006
}),
frameRate: 12,
repeat: -1
});generateFrameNames config:
prefix -- prepended to each frame numbersuffix -- appended after each frame numberstart, end -- numeric rangezeroPad -- left-pad numbers to this length with zerosframes -- explicit array of frame numbers (overrides start/end)If you call generateFrameNames(key) with no config, it returns all frames from the atlas.
Pass a texture key string as frames to use all frames from that texture, sorted numerically by default. Set sortFrames: false to disable sorting.
this.anims.create({ key: 'walk', frames: 'player_walk', frameRate: 12, repeat: -1 });this.anims.create({
key: 'pulse',
frames: this.anims.generateFrameNumbers('orb', { start: 0, end: 5 }),
frameRate: 10,
yoyo: true, // plays forward then backward
repeat: -1, // -1 = forever
repeatDelay: 500 // ms pause between each repeat cycle
});When yoyo is true, the animation plays forward then reverses. The full cycle counts as one play.
sprite.play('attack');
sprite.chain('idle'); // play idle after attack completes
sprite.chain(['fall', 'land', 'idle']); // chain multiple
sprite.anims.chain(); // clear the chain queueChaining is per-sprite. Chained animations start after animationcomplete or animationstop. An animation with repeat: -1 never completes -- call stop() to trigger the chain.
// Play an animation from last frame to first
sprite.playReverse('walk');
// Reverse direction mid-playback
sprite.anims.reverse();playReverse sets forward = false and inReverse = true. The reverse() method toggles direction mid-playback.
sprite.play('walk', true); // ignoreIfPlaying = true
sprite.anims.playAfterDelay('walk', 1000); // play after 1s delay
sprite.anims.playAfterRepeat('walk', 2); // play after current anim repeats 2xAdds a transition delay between two specific animations, set globally on the AnimationManager.
this.anims.addMix('idle', 'walk', 200);
this.anims.addMix('walk', 'idle', 300);
sprite.play('idle');
sprite.play('walk'); // 200ms mix delay applied automatically
this.anims.removeMix('idle', 'walk'); // remove specific pair
this.anims.removeMix('idle'); // remove all mixes for 'idle'Mix delays only apply with sprite.play(), not playAfterDelay or playAfterRepeat.
sprite.anims.pause(); // pause per-sprite
sprite.anims.resume(); // resume per-sprite
this.anims.pauseAll(); // global pause
this.anims.resumeAll(); // global resume
sprite.anims.stop(); // stop immediately
sprite.anims.stopAfterDelay(2000); // stop after 2 seconds
sprite.anims.stopAfterRepeat(1); // stop after 1 more repeat
sprite.anims.stopOnFrame(frame); // stop when a specific frame is reachedAll stop methods fire animationstop (not animationcomplete). Chained animations trigger after stop.
sprite.on('animationcomplete', (anim, frame, gameObject, frameKey) => {
console.log('completed:', anim.key);
});
// Key-specific complete -- only fires for the named animation
sprite.on('animationcomplete-explode', (anim, frame, gameObject, frameKey) => {
gameObject.destroy();
});Available events: animationstart, animationcomplete, animationcomplete-{key}, animationupdate, animationstop, animationrepeat, animationrestart. All share the same callback signature: (animation, frame, gameObject, frameKey).
sprite.on('animationupdate', (anim, frame, gameObject, frameKey) => {
if (anim.key === 'attack' && frame.index === 4) {
this.checkHit(gameObject);
}
});Individual frames can have a duration (ms) that is added to the base msPerFrame.
this.anims.create({
key: 'combo',
frames: [
{ key: 'fighter', frame: 'punch1', duration: 50 },
{ key: 'fighter', frame: 'kick', duration: 200 }, // hold longer
{ key: 'fighter', frame: 'recover', duration: 100 }
],
frameRate: 24
});// Visibility control
this.anims.create({
key: 'appear', frames: 'sparkle', frameRate: 12,
showOnStart: true, // sprite.visible = true when anim starts (after delay)
hideOnComplete: true, // sprite.visible = false when anim completes
showBeforeDelay: true // show first frame immediately even during delay
});
// Random start frame -- each sprite begins on a different frame
this.anims.create({
key: 'ambient', frames: 'fire', frameRate: 10, repeat: -1,
randomFrame: true
});
// TimeScale -- per-sprite or global speed control
sprite.anims.timeScale = 2; // 2x speed
sprite.play({ key: 'walk', timeScale: 0.5 }); // half speed via config
this.anims.globalTimeScale = 0.5; // affects ALL animationsconst enemies = this.add.group({ key: 'enemy', repeat: 9 });
this.anims.staggerPlay('walk', enemies.getChildren(), 100);
// Each sprite starts 100ms after the previous. Pass staggerFirst: false to skip delay on first.// Export all global animations to JSON
const data = this.anims.toJSON();
// Import animations from JSON (pass true to clear existing animations first)
this.anims.fromJSON(data);
this.anims.fromJSON(data, true);
// Check before creating to avoid duplicate warning
if (!this.anims.exists('walk')) {
this.anims.create({ key: 'walk', frames: 'player_walk', frameRate: 12, repeat: -1 });
}const anim = this.anims.get('walk');
// Add frames to the end
anim.addFrame(this.anims.generateFrameNumbers('player', { start: 8, end: 10 }));
// Insert frames at a specific index
anim.addFrameAt(this.anims.generateFrameNumbers('player', { frames: [5] }), 2);
// Remove a specific frame object
const frame = anim.frames[3];
anim.removeFrame(frame);
// Remove frame at index
anim.removeFrameAt(0);this.load.aseprite('paladin', 'paladin.png', 'paladin.json');
// In create:
this.anims.createFromAseprite('paladin'); // all tags
this.anims.createFromAseprite('paladin', ['walk']); // specific tags only
sprite.play('walk'); // play by tag namethis.anims.create())| Property | Type | Default | Description |
|---|---|---|---|
key | string | -- | Unique identifier for the animation |
frames | string or AnimationFrame[] | [] | Texture key string (uses all frames) or array of frame config objects |
sortFrames | boolean | true | Numerically sort frames when using a string key |
defaultTextureKey | string | null | Fallback texture key if not set per-frame |
frameRate | number | 24 | Playback rate in frames per second (used if duration is null) |
duration | number | null | Total animation length in ms (derives frameRate if set) |
skipMissedFrames | boolean | true | Skip frames when lagging behind |
delay | number | 0 | Delay before playback starts (ms) |
repeat | number | 0 | Times to repeat after first play (-1 = infinite) |
repeatDelay | number | 0 | Delay before each repeat (ms) |
yoyo | boolean | false | Reverse back to start before repeating |
showBeforeDelay | boolean | false | Show first frame immediately during delay period |
showOnStart | boolean | false | Set visible=true when animation starts |
hideOnComplete | boolean | false | Set visible=false when animation completes |
randomFrame | boolean | false | Start from a random frame |
sprite.play())All AnimationConfig timing properties are available, plus:
| Property | Type | Default | Description |
|---|---|---|---|
key | string or Animation | -- | Animation key or instance to play |
startFrame | number | 0 | Frame index to begin playback from |
timeScale | number | 1 | Speed multiplier for this playback |
Values in PlayAnimationConfig override the animation definition for this specific playback instance.
duration and frameRate are null: defaults to 24 fps.duration is set: frameRate is calculated as totalFrames / (duration / 1000).frameRate is set (even if duration is also set): frameRate wins, and duration is derived as (totalFrames / frameRate) * 1000.animationstart -- after delay expires, before first updateanimationupdate -- each frame changeanimationrepeat -- each repeat cycleanimationcomplete -- natural end (finite repeat)animationcomplete-{key} -- same, with animation key appendedStopped manually: animationstop fires instead of complete. Restarted mid-play: animationrestart fires.
All callbacks: (animation, frame, gameObject, frameKey).
Fire on this.anims: addanimation, removeanimation, pauseall, resumeall.
this.anims)| Method | Description |
|---|---|
create(config) | Create and register a global animation |
remove(key) | Remove a global animation by key |
get(key) | Get an Animation instance by key |
exists(key) | Check if a key is already registered |
generateFrameNumbers(key, config) | Generate frame array from a spritesheet |
generateFrameNames(key, config) | Generate frame array from an atlas |
play(key, children) | Play an animation on an array of Game Objects |
staggerPlay(key, children, stagger) | Staggered play across multiple Game Objects |
pauseAll() / resumeAll() | Pause/resume all animations globally |
addMix(animA, animB, delay) | Set transition delay between two animations |
removeMix(animA, animB?) | Remove a mix pairing |
getMix(animA, animB) | Get the mix delay between two animations |
createFromAseprite(key, tags?, target?) | Create animations from Aseprite JSON |
toJSON() | Export all animations as JSON data |
fromJSON(data, clear?) | Load animations from JSON data (pass true to clear existing first) |
sprite.anims)| Method | Description |
|---|---|
play(key, ignoreIfPlaying?) | Play an animation |
playReverse(key, ignoreIfPlaying?) | Play an animation in reverse |
playAfterDelay(key, delay) | Play after a delay in ms |
playAfterRepeat(key, repeatCount?) | Play after current anim repeats N times |
chain(key) | Queue animation(s) to play after current one |
stop() | Stop immediately |
stopAfterDelay(delay) | Stop after a delay in ms |
stopAfterRepeat(repeatCount?) | Stop after N more repeats |
stopOnFrame(frame) | Stop when a specific frame is reached |
pause(atFrame?) | Pause playback |
resume(fromFrame?) | Resume playback |
restart(includeDelay?, resetRepeats?) | Restart from beginning |
reverse() | Reverse direction mid-playback |
getName() | Get the current animation key |
getFrameName() | Get the current frame key |
getProgress() | Get progress 0-1 |
setProgress(value) | Set progress 0-1 |
setRepeat(value) | Change repeat count during playback |
getTotalFrames() | Get total frame count |
create(config) | Create a local animation on this sprite |
exists(key) | Check if a local animation exists |
get(key) | Get a local animation by key |
Key properties: isPlaying, hasStarted, currentAnim, currentFrame, forward, inReverse, timeScale.
this.anims.create() registers across all Scenes. Do not recreate in every Scene -- it logs a warning and returns the existing one.repeat: -1 never fires animationcomplete. Use stop() to end infinite animations. Listen for animationstop instead.frameRate beats duration. If both are set, frameRate wins. Set only duration (leave frameRate null) to control total length.duration is additive. Added on top of base msPerFrame, not a replacement.play() stops the current animation (fires animationstop). Use play(key, true) to skip if already playing.play(). playAfterDelay/playAfterRepeat bypass mixes.sprite.play(), sprite.playReverse(), sprite.chain(), sprite.stop() wrap sprite.anims.*.sprite.anims.chain() before stopping if unwanted.generateFrameNumbers end=-1 means last frame. The __BASE frame is excluded automatically.| File | Purpose |
|---|---|
src/animations/AnimationManager.js | Global singleton -- create, remove, get, generateFrame*, mix, staggerPlay |
src/animations/Animation.js | Animation definition -- frames, timing, yoyo, repeat logic |
src/animations/AnimationState.js | Per-sprite component -- play, stop, pause, chain, events |
src/animations/AnimationFrame.js | Single frame data -- textureKey, textureFrame, duration, progress |
src/animations/events/index.js | All animation event constants |
src/animations/typedefs/Animation.js | AnimationConfig typedef |
src/animations/typedefs/PlayAnimationConfig.js | PlayAnimationConfig typedef |
src/animations/typedefs/GenerateFrameNumbers.js | Config for generateFrameNumbers |
src/animations/typedefs/GenerateFrameNames.js | Config for generateFrameNames |
© autonomous-ai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in store/agents/phaser/skills/animations of autonomous-ai/openharness.
Open the folder on GitHubat commit 50da5db
Animations next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Animations this skillautonomous-ai/openharness | 1.1k | — | ~4.5k | Automated safety check: Pass | MIT | |
| Game Asset Generatorhtdt/godogen | 7.1k | — | ~2.8k | Automated safety check: Pass | MIT | |
| Code-Drawn 2D Game Art0x0funky/agent-sprite-forge | 4.3k | — | ~2.5k | Automated safety check: Pass | MIT | |
| Sprite Genaldegad/sprite-gen | 2.6k | — | ~4.5k | Automated safety check: Pass | Apache-2.0 | |
| Hatch PethAcKlyc/MyAgents | 918 | 2 repos | ~9.5k | Automated safety check: Pass | Apache-2.0 | |
| Pixel Artmateaix/mateclaw | 1.1k | 5 repos | ~1.8k | Automated safety check: Pass | Apache-2.0 |
htdt/godogen
Generates game art from text prompts: PNG images, GLB 3D models, rigged characters, animations and sprites, with background removal.
0x0funky/agent-sprite-forge
Draws 2D game art from code with no image model: pixel sprites, SVG props and icons, rigged characters, FX, autotiles and layouts, only when explicitly asked for.
aldegad/sprite-gen
Generates images and game sprites through GPT or Grok with guided provider choices, separate saved defaults, automatic cleanup and optional curation.
hAcKlyc/MyAgents
Create, repair, validate, visually QA, and package MyAgents/Codex-compatible animated pets and pet spritesheets from character art, generated images, company or prospect brand cues, or visual…
mateaix/mateclaw
Pixel art w/ era palettes (NES, Game Boy, PICO-8). An agent skill from mateaix/mateclaw.
crafter-station/petdex
Browse, install, submit, and edit pixel-art pets with the Petdex CLI.
autonomous-ai/openharness
Slices 3D mesh files into printer-profiled plain G-code through real slicer CLIs, with backend discovery, input inspection, dry runs and static validation.
autonomous-ai/openharness
Turns a home-automation request into standard, testable automations.yaml, run against Home Assistant Core's real triggers and verified with its own trace tool.
autonomous-ai/openharness
Turns a musical brief into LilyPond concert-pitch music, checked parts for each instrument and a playable practice pack.
autonomous-ai/openharness
Turns an STL and explicit printer and material requirements into compared OrcaSlicer plans, an editable 3MF project, checked G-code and a portable handoff.
autonomous-ai/openharness
Builds an editable DOCX report, a formula-driven XLSX workbook and a fresh LibreOffice PDF preview from one structured source file, then checks them together.
autonomous-ai/openharness
Dry-run, upload, and cautiously initiate local Bambu Lab print jobs from validated plain .gcode, using Bambu LAN FTPS/MQTT handoffs.
Categories
A skill your agent uses when creating or controlling sprite animations in Phaser 4. Animations is an agent skill from autonomous-ai/openharness. Use this skill when creating or controlling sprite animations in Phaser 4.
Animations fits situations like: controlling sprite animations in Phaser 4; : sprite animation; animation frames.
Run `npx skills add autonomous-ai/openharness --skill animations -a claude-code`. Or copy the skill folder (store/agents/phaser/skills/animations in autonomous-ai/openharness) into .claude/skills/animations in your project. Claude Code loads it when a task matches its description.
Run `npx skills add autonomous-ai/openharness --skill animations -a codex`. Or copy the skill folder (store/agents/phaser/skills/animations in autonomous-ai/openharness) into .agents/skills/animations in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add autonomous-ai/openharness --skill animations -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/animations, .gemini/skills/animations, .github/skills/animations and .opencode/skills/animations in your project.
SKILL.md names no scripts, command-line tools or credentials: Animations is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Animations is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.5k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Animations: Game Asset Generator (htdt/godogen, 7.1k stars), Code-Drawn 2D Game Art (0x0funky/agent-sprite-forge, 4.3k stars), Sprite Gen (aldegad/sprite-gen, 2.6k stars) and Hatch Pet (hAcKlyc/MyAgents, 918 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
autonomous-ai (a GitHub organization) maintains it in autonomous-ai/openharness, which has 1,149 GitHub stars. The repository holds 100 skills in this directory. The repository was last updated on October 8, 2026.
Source: autonomous-ai/openharness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.