feat(cli): add keyframes command to surface motion paths#1556
feat(cli): add keyframes command to surface motion paths#1556miguel-heygen wants to merge 1 commit into
Conversation
|
Warning This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
This stack of pull requests is managed by Graphite. Learn more about stacking. |
d713c33 to
5e8cf5e
Compare
775d644 to
070799e
Compare
jrusso1020
left a comment
There was a problem hiding this comment.
Approved at 5e8cf5e0 per Rames D Jusso "stamp-ready with 1 test gap on CLI." CLI surface for the keyframes/motion-path workstream is clean.
Worth adding the test for the keyframes-command path (Rames D Jusso called the specific gap out in his review). Non-blocking — fine as a follow-up commit before merge. Also: PR body is the unfilled template; please fill in before merge per the stack-wide note.
terencecho
left a comment
There was a problem hiding this comment.
CLI surface + skill wiring axis
Verified
hyperframes-keyframesskill correctly placed atskills/hyperframes-keyframes/SKILL.md, frontmatter hasname+descriptionper the canonical pattern, sits alongside the existinghyperframes-animation/hyperframes-cli/hyperframes-coresiblings.- Skill content documents the read-edit-verify loop, surfaces the
--jsonoutput shape for agents, and gives both object-form andmotionPathediting examples that match the actual CLI output. The ASCII path drawing is a nice touch for the "see motion as data" framing. - CLI command typed cleanly with
SurfacedTween/KeyframePoint/SurfacedCompositioninterfaces; registered incli.tscommandLoaderswith lazy import. pngDecodeBlitWorkerremoval cleanup is consistent — the env-var bootstrap was simplified to shader-only, andgit grepconfirms the realpngDecodeBlitWorkeris gone frompackages/producer/(only acrashOnMessageWorkertest fixture remains). No dead worker wiring.- EPIPE suppression correctly runs before any stdout/stderr write (declared at top of file, before the worker-path bootstrap). The flag-set-then-exit-0 pattern preserves telemetry-failure attribution.
Note (non-blocking)
- Title undersells scope. "add keyframes command" misses the EPIPE handler,
trackCommandFailureswrap, two additional commands (beats,cloudrun), and thepngDecodeBlitWorkercleanup. All look like legitimate improvements, but the title makes the CLI delta look smaller than +459/-0 actually is. A future bisect on EPIPE behavior won't land here from the title.
— Review by tai (pr-review)
Read-only ASCII + --json view of every GSAP tween's keyframes and motion path. Ships the hyperframes-keyframes agent skill.
5e8cf5e to
f6a0cbb
Compare
070799e to
227aebe
Compare
vanceingalls
left a comment
There was a problem hiding this comment.
Concurring with the consolidated stack review at HEAD f6a0cbb9. One specific finding the structural pass didn't surface, plus a scope clarification:
Duplicate fork of the canonical hold-marker helper. packages/cli/src/commands/keyframes.ts:116-117 defines a local isHoldMarker:
function isHoldMarker(anim: GsapAnimation): boolean {
return anim.properties?.data === "hf-hold" || anim.fromProperties?.data === "hf-hold";
}But @hyperframes/core already exports the canonical isStudioHoldSet at packages/core/src/parsers/gsapParser.ts:1573 alongside the STUDIO_HOLD_MARKER constant. The two are subtly different: the canonical version additionally requires method === "set", while the local one matches any animation with data === "hf-hold" on either properties bag. Equivalent today, but the moment the Studio tags a non-set tween with hf-hold (a perfectly plausible extension of the marker), this surface silently drops it. Cheap to fix by importing the canonical helper.
Scope clarification. This PR's file list at HEAD is exactly three: packages/cli/src/cli.ts (single line of registration), packages/cli/src/commands/keyframes.ts, and skills/hyperframes-keyframes/SKILL.md. The EPIPE handler, trackCommandFailures wrap, beats/cloudrun commands, and pngDecodeBlitWorker cleanup items raised in a parallel review appear to belong to a different PR — none of those files are in #1556's diff at any point in its history.
Minor notes already standing from the consolidation (silenced parseGsapScript catch, literal-vs-CSS-selector docstring drift, the absent smoke test) all still apply.
Review by Via
terencecho
left a comment
There was a problem hiding this comment.
Retraction & correction crediting @via
My prior review on this PR overstated scope. I cited EPIPE suppression, trackCommandFailures, beats / cloudrun command additions, and a pngDecodeBlitWorker cleanup as findings on #1556. Via correctly pointed out that #1556's actual delta at HEAD f6a0cbb9 is exactly three files — packages/cli/src/cli.ts, packages/cli/src/commands/keyframes.ts, skills/hyperframes-keyframes/SKILL.md. Verified via gh pr view 1556 --json files: file count = 3, gh pr diff 1556 | grep -c EPIPE = 0.
What went wrong on my end: I used git diff $(git merge-base main pr-1556)..pr-1556 -- packages/cli/src/cli.ts, which is stack-cumulative (traverses back through #1553→#1555 to the common ancestor with main). The PR-specific delta needed gh pr diff 1556, which compares against the PR's actual base (#1555's head). The EPIPE / trackCommandFailures / beats / cloudrun / pngDecodeBlitWorker items I attributed here likely live in an earlier PR in the stack — not in #1556. Title-undersells-scope was the wrong finding; the actual scope IS exactly what the title says.
What stands from my prior review:
hyperframes-keyframesskill correctly placed and frontmatter-correct ✓- SKILL.md content matches CLI output shape ✓
- CLI command typing clean (
SurfacedTween/KeyframePoint/SurfacedCompositioninterfaces) ✓ keyframesregistration incli.tscommandLoaders✓
Also concur with Via's separate finding on the isHoldMarker duplicate-fork of canonical isStudioHoldSet at keyframes.ts:116-117 — the method === "set" branch divergence is worth folding before merge.
— Review by tai (pr-review)
jrusso1020
left a comment
There was a problem hiding this comment.
Re-approved at f6a0cbb9 post-restack. CLI surface still clean.
Echoing Via's R2 finding: commands/keyframes.ts:116-117 has a local isHoldMarker that's a duplicate fork of the canonical isStudioHoldSet — subtly diverges on the method === "set" branch. Worth replacing with an import of the canonical helper to keep the hold-classification semantics in one place. Non-blocking, fine as a follow-up commit.
Plus: PR body still unfilled template; CLI test gap from R1 still applies.

Stack: GSAP keyframe + motion-path editing — CLI surface (#1553 → #1561).
What
Add a
hyperframes keyframesCLI command that surfaces an element's GSAP keyframes and motion-path geometry from a composition, plus an agent skill documenting it.Why
Lets users and agents inspect keyframe / motion-path data (and verify mutations) without opening the Studio UI — useful for scripting and for agent workflows.
How
commands/keyframes.ts: parses the composition's GSAP timeline via the core parser and prints per-element keyframes / paths; wired intocli.ts.skills/hyperframes-keyframes/SKILL.md: documents the command for agents.Test plan