Commit Graph
2323 Commits
Author SHA1 Message Date
Miguel Angel Simon Sierra 9f94a64673 Merge branch 'animejs-u10f' into worktree-feat-animejs-first-party 2026-07-08 21:09:59 -04:00
Miguel Angel Simon Sierra e5c948ee23 feat(registry): tag liquid-glass blocks as animejs runtime (U10f) 2026-07-08 21:08:10 -04:00
Miguel Angel Simon Sierra 4277369dbb Merge branch 'animejs-u11f' into worktree-feat-animejs-first-party 2026-07-08 20:55:07 -04:00
Miguel Angel Simon Sierra 9281503dfb Merge branch 'animejs-u11b' into worktree-feat-animejs-first-party 2026-07-08 20:54:29 -04:00
Miguel Angel Simon Sierra 7ca3b4b8a7 feat(registry): port liquid-glass blocks to anime.js (U10f) 2026-07-08 20:51:11 -04:00
Miguel Angel Simon Sierra 5e58fd9b17 docs(skills): fix em-dash replacement punctuation in anime.js port (U11 batch 2) 2026-07-08 20:50:36 -04:00
Miguel Angel Simon Sierra 72ac77a271 Merge branch 'animejs-u11e' into worktree-feat-animejs-first-party 2026-07-08 20:44:19 -04:00
Miguel Angel Simon Sierra e75b15824a docs(skills): port music-to-video primitives and templates to anime.js (U11 batch 5) 2026-07-08 20:43:05 -04:00
Miguel Angel Simon Sierra d098ec3234 docs(skills): anime-first workflow skills sweep (U11 batch 6) 2026-07-08 20:41:53 -04:00
Miguel Angel Simon Sierra e00788c5c2 docs(skills): port animation rules, blueprints, techniques to anime.js (U11 batch 2) 2026-07-08 20:35:51 -04:00
Miguel Angel Simon Sierra 85fdcef034 feat(scripts): extend gsap-to-anime coverage and fix silent-data-loss classes (U9)
Round 2: forEach over named const arrays, direct window.__timelines
member registration, no-op .call labels. Fixes four silent-data-loss
bugs: mutated arrays trusted at initial literal, helper declarations
dropped without expansion, bare reassignment and loop counters treated
as constants (which also overcounted round-1 conversions; 9 files
honestly demoted to manual). Final: 28 converted / 2 warnings / 117
manual. Shared finitePositiveNumber extracted in eval scripts.
2026-07-08 20:27:04 -04:00
Miguel Angel Simon Sierra a7be32112c Merge branch 'animejs-u11d' into worktree-feat-animejs-first-party 2026-07-08 20:20:05 -04:00
Miguel Angel Simon Sierra 099edb0434 docs(skills): anime-first keyframes, registry, and cli skills (U11 batch 4) 2026-07-08 20:15:43 -04:00
Miguel Angel Simon Sierra c8ba2ae8b2 docs(skills): anime.js first-party core and animation adapter guidance (U11 batch 1) 2026-07-08 20:11:20 -04:00
Miguel Angel Simon Sierra c938b7b3d0 fix(core,producer): prime wrappers without duration; forbid cross-instance property ownership
Gate re-run passes 8/8. Duck-typed anime wrappers lacking a readable
duration now prime via a large clamped seek. The animejs-adapter fixture
had two registered timelines animating scale on the same element, which
is order-dependent under independent seeks; corrected per the new
one-property-owner contract rule recorded in U3-GATE-RESULT.md. Eval
scripts get the scripts-convention fallow suppressions.
2026-07-08 19:46:57 -04:00
Miguel Angel Simon Sierra 9e16f191d1 Merge branch 'animejs-u19' into worktree-feat-animejs-first-party
# Conflicts:
#	package.json
2026-07-08 19:01:00 -04:00
Miguel Angel Simon Sierra ac83a74ef2 feat(eval): gsap-main baseline renderer and psnr compare cli (U19) 2026-07-08 19:00:25 -04:00
Miguel Angel Simon Sierra 64a6907475 chore(parsers,cli): apply twin-parser fallow conventions to anime parser (U12) 2026-07-08 18:59:40 -04:00
Miguel Angel Simon Sierra 1355baf7b6 Merge branch 'animejs-u12' into worktree-feat-animejs-first-party 2026-07-08 18:55:44 -04:00
Miguel Angel Simon Sierra 5f4183d88d fix(core): prime anime.js timelines at registration for cold-seek correctness (U1)
Anime.js 4.5.0 timeline children added at position greater than zero do
not render their from-values until the timeline has been sought past
that position once; a cold seek to frame 0 left them untouched. Prime
each instance once at registration (seek to duration, back to 0),
mirroring the GSAP adapter's totalTime nudge. Covers keyed and legacy
array registrations. Found by the U3 determinism gate.
2026-07-08 18:54:27 -04:00
Miguel Angel Simon Sierra de7c30902a chore: merge U8 anime defaults and pay down fallow debt
Concludes the animejs-u8 merge (generators, templates, CLI defaults,
figma emitters, registry runtime metadata) and clears all introduced
fallow findings: refactors stripJavaScriptComments/tagHasAttribute/
findInlineScriptBlocks in runtime detection, shared top-level scanner
and rawText module in the codemod, scan-state transition split, test
clone dedup, index/report cycle break, workspace deps declared.
2026-07-08 18:53:14 -04:00
Miguel Angel Simon Sierra e593b6b201 fix(core): emit native anime cubic bezier eases 2026-07-08 17:47:59 -04:00
Miguel Angel Simon Sierra 004f2bc560 feat(parsers,cli): anime.js acorn parser/writer and keyframes depth (U12) 2026-07-08 17:36:46 -04:00
Miguel Angel Simon Sierra 3f13d42d6b feat(core,cli): anime.js default generators, templates, and registry runtime metadata (U8) 2026-07-08 17:35:15 -04:00
Miguel Angel Simon Sierra 9d6822fff8 Merge branch 'animejs-u9' into worktree-feat-animejs-first-party 2026-07-08 17:30:40 -04:00
Miguel Angel Simon Sierra 6ab514ba70 Merge branch 'animejs-u3' into worktree-feat-animejs-first-party 2026-07-08 17:30:10 -04:00
Miguel Angel Simon Sierra 6392e103a6 docs(producer): anime.js 4.5.0 determinism gate result (U3) 2026-07-08 17:27:43 -04:00
Miguel Angel Simon Sierra 82f6d13b43 fix(scripts): reduce gsap-to-anime false manual classifications 2026-07-08 17:27:31 -04:00
Miguel Angel Simon Sierra a3021afb40 Merge branch 'animejs-u7' into worktree-feat-animejs-first-party 2026-07-08 17:27:14 -04:00
Miguel Angel Simon Sierra f35e7d8216 feat(producer,studio-server,player): anime.js dependency plumbing (U7) 2026-07-08 17:23:34 -04:00
Miguel Angel Simon Sierra 7844e82883 fix(producer): stop nested named functions breaking page.evaluate in determinism gate (U3) 2026-07-08 17:09:25 -04:00
Miguel Angel Simon Sierra 7f8042f39a feat(scripts): gsap-to-anime codemod with classification (U9) 2026-07-08 17:08:46 -04:00
Miguel Angel Simon Sierra 6b35f4defd Merge branch 'animejs-u4' into worktree-feat-animejs-first-party 2026-07-08 17:03:19 -04:00
Miguel Angel Simon Sierra 2eb0697def fix(producer): narrow anime engine activity check type (U3) 2026-07-08 17:03:03 -04:00
Miguel Angel Simon Sierra 9f2e8f56f8 feat(core): anime.js sub-composition scoping (U4) 2026-07-08 17:02:00 -04:00
Miguel Angel Simon Sierra d6567fee06 Merge branch 'animejs-u6' into worktree-feat-animejs-first-party 2026-07-08 17:01:55 -04:00
Miguel Angel Simon Sierra f905f67d54 feat(lint): anime.js first-party lint rules (U6)
Allow timeline registry lint to accept hyperframesAnime.register() and __hfAnime.
Treat registered finite anime instances as duration sources.
Add anime.js registration, autoplay, and infinite-loop diagnostics.
Make the validate CDN-timeout hint engine-neutral.
2026-07-08 17:00:45 -04:00
Miguel Angel Simon Sierra c3d1b79b07 Merge branch 'animejs-u18' into worktree-feat-animejs-first-party 2026-07-08 16:59:31 -04:00
Miguel Angel Simon Sierra 3d1898e5ec feat(parsers): shared animation runtime classifier (U18) 2026-07-08 16:58:07 -04:00
Miguel Angel Simon Sierra 78e4582d01 test(producer): anime.js 4.5.0 determinism gate fixtures (U3)
Adds focused anime.js 4.5 determinism fixtures plus a Puppeteer gate that compiles and serves each fixture through the producer runtime path, then checks repeat seeks, out-of-order seeks, backward seeks, bounds behavior, and anime engine activity from DOM snapshots.
2026-07-08 16:58:05 -04:00
Miguel Angel Simon Sierra 58bf96752a Merge branch 'animejs-u2' into worktree-feat-animejs-first-party 2026-07-08 16:38:14 -04:00
Miguel Angel Simon Sierra 127b62a39f feat(core): gsap-to-anime ease map and CustomEase shim (U2) 2026-07-08 16:36:24 -04:00
Miguel Angel Simon Sierra 3e1ecf77bb feat(core): anime.js first-party runtime contract (U1) 2026-07-08 16:30:08 -04:00
WaterrrForever 17b852784b feat(skills): mode-first briefs, value-first storyboards, and destination defaults across creation workflows (#2058)
* feat(skills): add brief contract — interaction modes + shared intake fields across workflows

New hyperframes-core/references/brief-contract.md, the shared intake
contract every creation workflow now runs its brief against:

- §1 interaction mode: collaborative (default) vs autonomous, ongoing
  vs one-time signals, mode set once and carried forward, and a gate
  taxonomy (preference / checkpoint / quality / routing) — autonomous
  skips waiting, never verification
- §2 field registry: destination→aspect derivation (feed → 1:1,
  Shorts/TikTok → 9:16, else 16:9), message, angle, length, audience,
  language, narration — each workflow binds fields as ask or state
- §3 question rules: one round with one question per asked field
  (native question UI mandatory when available, recommended option
  first with a receipt), never drop a question as inferable, and a
  mode legend advertised in the intro text instead of asked

Wired into the surfaces:

- hyperframes router: detect mode at entry, derive aspect from
  destination instead of stating 16:9
- product-launch-video / pr-to-video / faceless-explainer: ask/state
  binding tables at Step 0; Step 3/6 checkpoint-gate branches
  (autonomous posts a heads-up with a preview hint before render)
- website-to-video: local mode definition now defers to the contract
- music-to-video, general-video, embedded-captions, talking-head-recut,
  slideshow, motion-graphics: mode semantics wired per gate type
- storyboard-format: new optional 'mode' frontmatter key
- pr-to-video: length tier is a ceiling, not a floor — a one-headline
  PR recommends inside the 30–90s sweet spot regardless of diff size

* feat(skills): story spine + mode-first brief across creation workflows

Story — the reverse-iceberg feedback:

- New hyperframes-creative/references/story-spine.md, three rules for
  the narrated workflows: the hook speaks the viewer's outcome
  language, the value claim lands by beat 2 (implementation is the
  footnote of the story, not the spine), and the storyboard is
  presented as a proposal — 'This video tells [audience] that
  [message]' plus a per-frame why: drawn from narrativeRole
- pr-to-video: feature-reveal reordered promise-first (impact leads,
  diff/mechanism follow as evidence); hooks ban file/function names;
  fix-explainer, refactor-walkthrough, changelog unchanged
- product-launch-video / faceless-explainer hook rules aligned to the
  spine; website-to-video's beat summary gains the echo line + why:;
  general-video points at the spine from its plan step

Brief — hardened after live-test drift:

- Mode is now the first question (Collaborative recommended vs
  Autonomous), its own round, skipped when the request carries a
  signal; autonomous asks nothing further until one final
  preview-or-render question before render
- Step 0 rewritten as a literal two-round question script in each
  shot-sequence workflow (website-to-video's editorial register,
  channel-agnostic); brief-contract.md §3 reduced to invariants so the
  procedure lives in exactly one place

* feat(skills): split type minimums by viewing context

typography.md: full-screen viewing keeps body 20px / headline 60px;
in-feed destinations (X / LinkedIn / Instagram — brief-contract's
destination field) scale to body >=32px, headline >=90px, data labels
>=24px. First-pass values, to be calibrated against real renders.

* feat(skills): storyboard proposal as a table + credits close by default

- story-spine § 3: the proposal presents frames as a markdown table
  (frame · beat · on screen · why) instead of dense paragraphs; the
  three shot-sequence workflows and website-to-video's beat summary
  reference the same shape
- pr-to-video: the credits close is now the default ending — every PR
  video ends on a contributors frame (committers by commit count, 1-6
  avatars), with no taste judgment; the only skip is when no avatar
  was fetched, and the user can cut the frame in the proposal

* fix(skills): address review nits on the brief/story contracts

- embedded-captions: the identity procedure now states both sides of the
  preference gate inline (user picks; autonomous picks with a stated why)
- website-to-video step-2-brief: note that its mode section is the
  workflow's application of brief-contract.md, not a second definition
- brief-contract: resuming a project reads mode from STORYBOARD.md
  frontmatter — a recorded mode counts as set, closing the write-only gap

* docs(skills): add a non-code receipts example to the brief contract

Review nit (jrusso1020, #2058): the receipts example in § 3 was
PR-video-shaped only. A destination-shaped example joins it so the rule
reads as workflow-neutral.
2026-07-09 01:58:51 +08:00
81884a7495 fix(cli,skills): install workflow skills on demand instead of re-pulling the full set (#2012)
* fix(cli,skills): install workflow skills on demand instead of re-pulling the full set

Users report every init re-pulls all 21 skills into ~/.agents/skills
whenever anything is stale or missing - heavy, noisy, and it re-expands
deliberate partial installs.

Split the set into two tiers:

- core: the /hyperframes router + hyperframes-* domain skills +
  media-use, which every workflow references structurally. init and
  bare 'skills update' keep these (plus anything already installed)
  fresh, and never expand the install.
- on demand: the end-user workflow skills (and figma). They install at
  trigger time via 'skills update <name...>' - positional names are
  the only way update expands an install: one targeted
  'skills add --skill <name>' covering only stale/missing targets, a
  fast no-op when current, presence-verified after install, exit 1 on
  unknown names, and a presence-only degrade when GitHub is
  unreachable.

The /hyperframes router now runs 'skills update <workflow>' after
routing and before reading the workflow skill, so a routed workflow is
guaranteed present even on a machine that only has the core set. Each
on-demand skill also opens with the same self-maintenance step (run
'npx hyperframes skills update <name>' silently), so a workflow
triggered directly - without the router - still refreshes itself and
restores any missing core skill before relying on it.

When the manifest is unreachable (offline / rate-limited) the engine
degrades honestly instead of claiming success: named runs presence-check
the request plus a pinned fallback core list (unit-pinned to skills/)
and blind-install whatever is absent; a bare strict update fails loudly
so the 'check || update' chain can't pass while everything stays stale;
init reports the skipped freshness check. --json emits structured
errors on failure paths.

skills check still lists every skill, but exits non-zero only for
stale installed skills, an incomplete core set, or removed leftovers -
workflow skills not yet installed are reported as available on demand.
Bare 'hyperframes skills' (and 'skills add --all') remain the explicit
full-set installs.

Verified end-to-end with a sandboxed $HOME: fresh init installs the 9
core skills only; 'skills update slideshow' adds exactly that skill
(no-op on re-run, exit 1 on unknown names); bare update refreshes
without expanding; a live Claude Code run routed PR-to-video, executed
the router's update step, and the workflow skill appeared before use;
and a second live run triggered an installed workflow directly, whose
opening maintenance step restored a deliberately removed core skill.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(skills): clarify update-engine contracts + document lazy-install model

- skills.ts: note the UpdateSkillsResult.unknown strict-mode contract,
  verifyInstalled's non-strict (warn-not-throw) intent, and that a
  partial install stays "refreshed but never expanded" (review nits).
- docs/guides/skills.mdx: add a "Keeping skills current" section covering
  the core-eager / workflow-on-demand model and the skills check|update
  commands, per the repo's catalog-maintenance rule.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: kiritowoo <295860553+kiritowoo@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Miao Yang <miao.yang@heygen.com>
2026-07-09 01:30:51 +08:00
Vance Ingalls e52bfc246a Merge pull request #2053 from heygen-com/vi/figma-loop-fixes
fix(core,cli,lint): close the figma brand-token loop — runtime CSS variables, --name, snippet lint
2026-07-08 09:27:19 -07:00
WaterrrForever 4d3cdc3e4b feat(media-use): resolve official brand logos via a four-tier cascade (#2061)
* feat(media-use): resolve official brand logos via a four-tier cascade

Third-party brand logos (the meeting's 'credibility signals lost' gap)
had no acquisition path: capture only grabs the product's own site
assets, and HeyGen asset search returns generic look-alike icons for
brand queries (0/3 in testing — an X-in-a-circle for LinkedIn). Workers
could only fake a mark or drop it.

New resolve type 'logo', four tiers verified by a 54-brand stress test
(100% cascade hit across dev tools / big tech / non-tech / CN brands):

- svgl — official full-color vector SVGs + wordmark variants (40/54
  first-hits); search is substring-based, so entities pass through
  alias normalization (nextjs → 'next.js', aws → 'amazon web services')
- simple-icons (pinned CDN build) — official monochrome glyphs; catches
  the long tail (nike, visa, toyota, wechat, bytedance)
- github org avatar — known-org map only; a brand name is not a GitHub
  login, guessing risks same-named personal accounts
- domain favicon (DuckDuckGo ip3) — small-raster last resort; sub-500B
  responses are DDG's placeholder and rejected; frozen with a low_res
  provenance flag (chip-size use only)

logo joins the icon/image equivalence group (typesMatch) and the
images/ subdir, so entity cache hits interop with figma-imported marks.
A total miss falls through resolve's normal failure path — no special
casing. HeyGen search stays the icon provider; it is deliberately
absent from the logo cascade.

Docs: media-use gap/types/providers tables + example; the five
workflow banners now cover logos (catalog claim kept for media, 'from
their official sources' added for logos); product-launch story-design
and motion-graphics logo-reveal point at the new type; catalog
surfaces (CLAUDE.md / README / docs) updated in lockstep.

Verified: 19 unit tests + coverage row green; live smoke across all
four tiers (linkedin→svgl, nike→simple-icons, heygen→github.avatar,
amazon→favicon) plus a fabricated brand exiting 1 on the default miss
path. oxlint + oxfmt clean.

* test(media-use): sanction the four logo providers in the registry allowlist

svgl / simple-icons / github.avatar / favicon.ddg join the sanctioned
list — the logo cascade added in the previous commit. Full lib suite
95/95 green.

* test(media-use): gate the logo cascade behavior in CI + single-fetch favicon tier

Review follow-ups (miga-heygen, jrusso1020 on #2061):

- Eight mocked-network tests pin what the manual 54-brand stress test
  only asserted: descriptor shape, alias retry (svgl non-array payload
  → next query, simple-icons 404 → next slug), network-error → null
  fallthrough, the sub-500B placeholder rejection, github's
  no-guessing (zero fetches for unmapped entities), and the real
  cascade order landing tier by tier under a mocked network.
- faviconSearch now hands its verified bytes over as a local file, so
  the freeze step copies instead of re-downloading — one round-trip,
  and the size check is authoritative over what gets frozen.
- The header's hit counts are labeled as a stress-test snapshot, not a
  live invariant.

Full lib suite 103/103; live smoke re-verified (amazon → favicon.ddg,
frozen .ico).
2026-07-08 23:58:41 +08:00
Vance IngallsandClaude Fable 5 d9368ec051 fix(core): address PR feedback — ReDoS-safe slug trim, getVariables cleanups
- slugify: replace the anchored alternated trim regex (/^-+|-+$/g) with a
  character-scan trim — CodeQL js/polynomial-redos blocker.
- readRenderOverrides: fold the readOverrides wrapper into the exported
  function (one name, no pass-through).
- getVariables: deduplicate declarers with a Set, matching
  injectCompositionCssVariables.
- Move the tokenSlug import to the top of the file.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 02:34:18 -07:00
Vance IngallsandClaude Fable 5 e2c88ef689 fix(core,producer): composition CSS variables reach the render path at eval time
Live testing of the compile-time variable emission surfaced four gaps:

- The producer render path never emitted the compile-time stylesheet (only
  the preview bundler did), so eval-time reads — GSAP .from immediateRender,
  top-level getComputedStyle — saw undefined vars in rendered output. The
  producer's inlineSubCompositions now calls the shared
  emitRootCompositionVariableStyles and passes the variable hooks.
- --variables overrides weren't visible at eval time. They now thread from
  the orchestrator / distributed plan through compileStage into the emitted
  rules (window.__hfVariables still covers script reads).
- Per-declarer rules anchored on data-composition-id, which two inlined
  instances of one sub-composition share — instance A's rule restyled
  instance B, and a rule directly on the declarer defeated the host's
  inherited data-variable-values. Rules now anchor on per-instance
  data-hf-var-scope markers and layer nearest-host values over declared
  defaults, mirroring the runtime loader.
- Emission ignored authored CSS; a declared default now yields to a var
  already defined in an authored <style> block (define-if-absent, matching
  the runtime injection).

Also: the figma importer emits background-color (longhand) for solid fills.
GSAP backgroundColor tweens cannot read a var() through the background
shorthand — its pending-substitution longhands serialize empty, so .from
captured nothing and settled on transparent (pre-existing GSAP interaction,
reproduced with no composition variables involved).

Validated live: eval-time default + override, .from + override, two-instance
host branding, authored :root precedence, SDS brand-loop pixel parity.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 02:28:16 -07:00
Vance Ingalls 6192ed4cbd Merge pull request #1779 from heygen-com/feat/lint-gsap-non-transform-motion
feat(lint): add gsap_non_transform_motion rule, migrate registry comps to transforms
2026-07-08 01:38:53 -07:00