Skip to content

Releases: kiyeonjeon21/reframe

v0.6.49

Choose a tag to compare

@github-actions github-actions released this 22 Jun 14:16
f604077

See CHANGELOG.md.

v0.6.48

Choose a tag to compare

@github-actions github-actions released this 22 Jun 11:29
1dfd195

See CHANGELOG.md.

v0.6.47

Choose a tag to compare

@github-actions github-actions released this 22 Jun 05:11
ad6c922

See CHANGELOG.md.

v0.6.46 — Spatial query (`sceneGeometry`/`hitTest`) + embedded-editor `player --edit`

Choose a tag to compare

@github-actions github-actions released this 21 Jun 14:26
80c1aed

Added

Spatial query (sceneGeometry/hitTest) + embedded-editor player --edit

  • New core spatial query — the spatial analog of sceneManifest: where manifest answers
    "what can I edit?" (addresses), sceneGeometry(compiled, t) answers "where is it on screen,
    and what's under a point?". Returns each node's rotated corners + AABB bounds, group
    bounds (union of descendants), and motionPath waypoints (→ timeline.<label>.points).
    hitTest(geometry, x, y) → the topmost node at a point. Pure functions over the DisplayList
    (each op already carries its source id + final scene-space transform) + canvas-free Inter
    advances (textWidth) — no evaluate/DisplayOp change, goldens byte-identical. Exported
    from @reframe/core; CLI reframe geometry <scene> [--t <sec>] [--json].
  • player --edit — an embedded-editor build of the HTML player: no autoplay, seek-driven,
    exposing window.__reframe = { seek, hitTest, bounds, waypoints, setOverlay, play, pause } +
    a host↔iframe postMessage channel. setOverlay(doc) re-runs composeScene+compileScene
    +redraw in-browser, no reload — the live overlay-preview loop, so a dragged node/waypoint
    round-trips as a regen-stable overlay patch. --edit-origin gates event.origin. The default
    (no --edit) build is byte-identical. Closes #81.

v0.6.45 — `reframe compose` — emit a composed SceneIR (overlay → IR), for live overlay preview

Choose a tag to compare

@github-actions github-actions released this 21 Jun 12:26
c8c59cf

Added

reframe compose — emit a composed SceneIR (overlay → IR), for live overlay preview

  • New verb reframe compose <scene.ts|.json> --overlay <doc>... [-o out.json] [--json]
    composes overlay(s) onto a base and emits the composed SceneIR (no render). This is the
    IR half of the core composeScene (verify-overlay is its report half). stdout stays a
    bare SceneIR (pipe straight into player/frame); the applied/orphan report goes to stderr.
    Non-gating — orphans are reported but the partial IR is still emitted. Base may be a .ts
    source or a .json IR (composition is a post-compile IR→IR transform). Unblocks a live editor:
    manifest --json → build an OverlayDoccomposeplayer, no mp4.
  • --overlay on frame and player — compose-then-preview in one step (mirrors
    render --overlay): player scene.ts --overlay edits.json builds an instant interactive HTML
    with the edit applied; frame scene.ts --overlay edits.json renders a single PNG.
  • compile --overlay now errors with a pointer instead of silently ignoring the flag
    (a footgun fix): compile is source→IR only; composition is a separate transform.
  • Shared applyOverlays helper (packages/render-cli/src/overlay.ts) behind
    render/compose/frame/player, so they all compose + report identically. Closes #76.

v0.6.44 — Scene-fitted Kokoro narration (`reframe narrate` + `audio.narration`)

Choose a tag to compare

@github-actions github-actions released this 21 Jun 11:55
daf146e

Added

Scene-fitted Kokoro narration (reframe narrate + audio.narration)

  • New IR field AudioIR.narration — spoken voiceover lines ({ at, text, voice? })
    authored as a sibling <scene>-vo/script.json the scene imports. Each line resolves to a
    label-anchored file cue (so VO survives retiming/regen), with a baked duration
    sizing the bed's duck window. Additive + golden-safe (no narration → byte-identical plan).
  • New command reframe narrate <scene> [--voice] [--max-speed] [--dry-run] — reads the
    compiled label clock, synthesizes each line with a Kokoro python sidecar (narrate.py),
    and auto-fits its speech rate to the slot between its anchor and the next line (bounded;
    warns if even max speed overruns). Bakes file/voice/speed/duration back into
    script.json (like assemble bakes ffprobe numbers). --dry-run prints the fit table from
    a length estimate with no synthesis.
  • Kokoro is an optional dependency (pip install kokoro + espeak-ng), preflighted like
    ffmpeg/chromium. The .wav are external assets (same-machine, not golden) — the determinism
    contract still covers the AudioPlan, not the synthesized audio bytes.
  • Example examples/scenes/narrated-demo.ts (+ narrated-demo-vo/script.json).

v0.6.43 — Structured validation errors (`code` + `path` alongside the message)

Choose a tag to compare

@github-actions github-actions released this 20 Jun 19:00
4c36c5a

Added

Structured validation errors (code + path alongside the message)

  • SceneValidationError now carries .issues: ValidationIssue[] — each problem is
    { code, path, message } with a stable machine code (unknown-blend, duplicate-node-id,
    unknown-timeline-label, bad-duration, …) and a path locator (nodes.box,
    timeline.beat(in)[0], camera.zoom, audio.cues[0]), so a consumer can categorize a
    failure and point a UI at the offending element instead of parsing prose.
  • Propagated in-process: SceneLoadError.issues carries them across the scene's own bundled
    core (read as a plain property, since instanceof can't cross the bundle), and
    reframe compile --json failures include issues ({ ok:false, error, kind, issues? }).
    ValidationIssue is exported from @reframe/core and reframe-video/compile.
  • Fully back-compat / additive: every message is byte-identical, and .problems (string[])
    • .message + the class identity are unchanged — the existing toThrow(/…/) suite passes
      untouched. Validation isn't on the render path, so goldens are unaffected.

v0.6.42 — Determinism guard — `reframe lint` now enforces scene purity

Choose a tag to compare

@github-actions github-actions released this 20 Jun 18:05
26aceb9

Added

Determinism guard — reframe lint now enforces scene purity

  • Scenes must be pure functions of time (no Math.random()/Date), but nothing enforced
    it: a non-pure scene compiled to a different IR each time, silently breaking
    reproducibility (the golden tests only cover IR→render, not source→IR). reframe lint now
    closes that gap for .ts sources: it bundles the scene once, evaluates it twice, and
    emits a non-deterministic-render finding pinned to the first IR address that differs
    (e.g. nodes[0].props.x changed 0.42 → 0.97), with a hint at the culprit construct. Part
    of the same --strict gate as the addressability checks.
  • New in-process API checkDeterminism(path) (exported via reframe-video/compile) →
    { deterministic, findings }, so an embedder can verify a freshly generated scene before
    trusting it. Additive: pure scenes report clean, and the check only runs on source inputs
    (.json is the IR itself). Implementation note: the two evals use distinct cache-busting
    comments to defeat Node's data:-URL ESM module cache (without which the second eval would
    return the cached module and miss module-level nondeterminism).

v0.6.41 — Structural insert — `insertNodes` + `insertTimeline` overlay verbs (Spine 2c)

Choose a tag to compare

@github-actions github-actions released this 20 Jun 16:39
05f7002

Added

Structural insert — insertNodes + insertTimeline overlay verbs (Spine 2c)

  • Two positioned-insert compose verbs complete the structural-editing CRUD surface
    (add / remove / reorder / insert):
    • insertNodes — insert a node at a position (before/after a sibling root id,
      or an index) instead of appending on top like addNodes, so a new layer can land
      UNDER later nodes (e.g. a montage shot below the vignette/scrim grade).
    • insertTimeline — splice a step/beat into a named beat ({ into, before/after/index, step }). The step's tween/motionPath targets must exist; unknown into/before/after
      or a missing target is reported as an orphan, never a silent drop.
  • photoMontage/videoMontage now group the shot beats directly under the "montage"
    beat (the redundant inner seq wrapper is gone — timing-equivalent), so the play order is
    addressable: insertTimeline { into: "montage", after: "shot-1", step } splices a shot into
    the sequence. Reorder (order) and removeTimeline are unaffected.
  • Unlike reorder/remove (which patch existing addressable elements), insert creates
    elements, so the overlay carries the full node + beat JSON — a consumer (reframe-studio) or
    the author supplies it; reframe does not generate the montage shot payload. See
    examples/overlays/montage-insert.json and docs/guides/regen-contract.md.

v0.6.40 — Structural montage editing — reorder + remove (Spine 2c)

Choose a tag to compare

@github-actions github-actions released this 20 Jun 16:18
f581884

Added

Structural montage editing — reorder + remove (Spine 2c)

  • photoMontage/videoMontage rewritten so each shot is a SELF-CONTAINED named beat
    shot-${i}
    that owns only its own layer's motion (fade-in ∥ Ken Burns ∥ fade-out). Every
    layer now starts at opacity: 0, and adjacent shots overlap by the crossfade via a negative
    gap in the seq — no shot references its neighbour anymore. This makes a shot an
    independent unit you can reorder, drop, or swap by overlay and survive AI regeneration:
    • Reorder — the existing beat order patch (timeline.shot-2.order) re-sorts shots.
    • Remove — a new generic compose verb removeTimeline: ["shot-2"] splices a beat/step
      out of its parent by label; the seq re-accumulates so later shots ripple up and
      label-anchored dependents (clip start, anchored titles) follow. A dropped shot's layer just
      stays invisible (it never fades in).
    • Swap an image — already a plain nodes.<id>.src patch.
  • removeTimeline is the structural complement of the timeline retiming patch (parallel to
    removeNodes); an unknown label is reported as an orphan, never a silent drop. See
    docs/guides/regen-contract.md and examples/overlays/montage-restructure.json.
  • The montage now opens on a fade-up and closes on a fade-out (symmetric → edit-safe). Note:
    montage timing shifts slightly (shots overlap by the crossfade); the montage has no golden
    snapshot, so this is a behaviour change in the generator output only, not a determinism break.
  • Every generated montage tween now carries a stable label (shot-${i}-in/-kb for the
    fade-in / Ken Burns, cross-${i} for a crossfade, shot-${last}-out for the closing fade)
    alongside the shot-${i} beat name, so the motion is fully addressable by an overlay and
    reframe lint reports no unaddressable motion on a montage.