claude-handoff
MAmattpocock/skills288k10,178 new stars in the last 7 days
Create custom desktop pet (Mate) characters with spritesheet and manifest. Use when the user asks to 'create a pet', 'make a desktop companion', 'design a mate character', 'generate a spritesheet for my pet', or wants to customize their desktop buddy. Generates a WebP spritesheet + manifest.json that can be loaded by MiMo Desktop's Mate system.
Create animated desktop pet characters for MiMo Desktop's Mate (桌面伙伴) system.
A valid custom pet lives in a folder with this structure:
<pet-id>/
├── manifest.json # Required — animation metadata
└── spritesheet.webp # Required — all animation frames in a grid
The user places this folder in their MiMo Desktop custom pets directory (userData/pets/<pet-id>/), then clicks "Refresh" in Settings → Mate to load it.
{
"id": "my-pet",
"name": "My Pet",
"description": "A cute custom pet",
"version": 1,
"spritesheet": "spritesheet.webp",
"frameWidth": 240,
"frameHeight": 240,
"columns": 8,
"totalFrames": 16,
"animations": {
"idle": { "row": 0, "frames": 8, "fps": 8, "loop": true }
}
}
| Field | Type | Description |
|---|---|---|
id | string | Unique identifier (kebab-case) |
name | string | Display name |
version | number | Always 1 |
spritesheet | string | Filename of the spritesheet image |
frameWidth | number | Width of each frame in pixels |
frameHeight | number | Height of each frame in pixels |
columns | number | Number of columns in the spritesheet grid |
totalFrames | number | Total number of frames across all animations |
animations | object | At minimum must include idle |
| Field | Type | Description |
|---|---|---|
description | string | Shown in settings UI |
anchorX | number | Horizontal anchor (0–1, default 0.5) for centering |
Each animation entry:
| Field | Type | Description |
|---|---|---|
row | number | Row index in the spritesheet (0-based) |
frames | number | Number of frames in this animation |
fps | number | Playback speed (recommended: 6–12) |
loop | boolean | Whether the animation loops |
The idle animation is required — it plays by default when the pet is loaded.
row field in the animation definition).frameWidth × frameHeight).Ask the user:
Use the imagegen skill to generate the spritesheet image. Construct the prompt with these guidelines:
If the generated image is already WebP, use it directly. If it is PNG or another format, convert to WebP:
# Convert to lossless WebP preserving transparency
cwebp -lossless -q 100 spritesheet.png -o spritesheet.webp
If cwebp is not available, check for sips (macOS Ventura+ supports WebP export):
sips -s format webp spritesheet.png --out spritesheet.webp
If neither tool is available, instruct the user to install one:
brew install webp # provides cwebp
Do NOT silently rename a PNG to .webp — the file must have valid WebP encoding (RIFF/WEBP header). If conversion genuinely cannot be performed, fail explicitly and tell the user what tool to install.
If imagegen is unavailable (skill not enabled or image generation fails), fall back to generating pixel-art frames directly as SVG, then rasterize. Compute dimensions from the manifest:
# Calculate actual spritesheet dimensions from manifest
WIDTH=$((frameWidth * columns))
HEIGHT=$((frameHeight * rows)) # rows = max animation row index + 1
# Rasterize SVG to PNG, then convert to WebP
rsvg-convert -w $WIDTH -h $HEIGHT spritesheet.svg -o spritesheet.png
cwebp -lossless spritesheet.png -o spritesheet.webp
As a last resort, output the SVG file directly and instruct the user to convert it manually.
Generate manifest.json with correct dimensions matching the actual spritesheet output. Verify:
frameWidth × columns = spritesheet total widthframeHeight × (max animation row index + 1) = spritesheet total heightanimations.idle exists with valid row, frames, fps, loopframes ≤ columns (frames per row cannot exceed grid columns)Write both files to the current working directory under a folder named with the pet ID. Tell the user to:
idle animation MUST exist — the system falls back to it.koala, panda), the preset wins.MAmattpocock/skills288k10,178 new stars in the last 7 days
AFaffaan-m/ECC278k4,046 new stars in the last 7 days
AFaffaan-m/ECC278k4,046 new stars in the last 7 days
AFaffaan-m/ECC278k4,046 new stars in the last 7 days
DIDietrichGebert/ponytail162k5,405 new stars in the last 7 days
DIDietrichGebert/ponytail162k5,405 new stars in the last 7 days