executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
animatorCreate short video animations from HTML/CSS/JS. Frame-by-frame capture at 30fps using Playwright + ffmpeg. Write CSS animations normally - the recorder pauses and steps them. Use for product demos, social clips, ad creative, feature announcements.
Independent GitHub snapshot · Automated classification · Original documentation governs
Create short mp4 videos from HTML/CSS/JS animations. Frame-by-frame capture using Playwright + ffmpeg. Deterministic, smooth, pixel-perfect 30fps output.
Read ~/.claude/skills/animator/LEARNED.md at the start of every task. If it doesn't exist, create it with a # Learned header.
Capture learnings when you detect:
Before appending, check:
Format: One line, actionable. Write the rule, not the story.
Don't ask permission. Append and move on.
node ~/.claude/skills/animator/scripts/record.js animation.html output.mp4
Options: --fps 30 --width 1280 --height 720
Start from the template: ~/.claude/skills/animator/templates/boilerplate.html
width x height (default 1280x720) with overflow: hiddenwindow.ANIMATION = { fps: 30, totalFrames: N }currentTime per frame. Easing, delays, fill-mode all work.window.renderFrame = function(frame, totalFrames) {} for anything CSS can't do (dynamic text, data-driven, conditional logic)animation-fill-mode: forwards to hold final stateanimation-delay to sequence elements (stagger entrances)cubic-bezier() renders perfectly frame-by-frameclip-path, filter, backdrop-filter, transforms all workframe is 0-indexed, totalFrames is the total countprogress = frame / totalFrames gives 0 to 1Staggered entrance:
.item:nth-child(1) { animation: fadeIn 0.5s 0.0s forwards; }
.item:nth-child(2) { animation: fadeIn 0.5s 0.2s forwards; }
.item:nth-child(3) { animation: fadeIn 0.5s 0.4s forwards; }
Typewriter (JS):
window.renderFrame = function(frame, total) {
const text = "Hello, world";
const chars = Math.floor((frame / total) * text.length);
document.getElementById('typed').textContent = text.slice(0, chars);
};
Scene transitions:
.scene-1 { animation: fadeOut 0.3s 2s forwards; }
.scene-2 { animation: fadeIn 0.3s 2.3s forwards; opacity: 0; }
requestAnimationFrame loops - use renderFrame() insteadsetInterval/setTimeout for animation - they won't sync with frame capture