2032 Commits
Author SHA1 Message Date
Miguel Ángel 71b668010f fix(cli): the ignored-binary note names only the missing binary, and covers .hyperframes/bin (#6807) 2026-10-30 08:38:05 +00:00
Miguel Ángel 0bd1fd5972 fix(cli): add says --dir is the project root when the folder is missing (#6808) 2026-10-30 08:27:17 +00:00
Miguel Ángel f4bbbe1074 chore: release v0.8.221 (#6802) 2026-10-30 06:41:36 +00:00
Miguel Ángel 47a1a92064 fix(cli): a missing registry item names the closest ones, and a blocked browser says how to allow it (#6799)
* fix(cli): a missing registry item names the closest ones, and a blocked browser says how to allow it

* fix(cli): let closestNames carry its rule in its name
2026-10-30 06:15:03 +00:00
Miguel Ángel 32c01c99a1 fix(registry): caption components keep the last phrase until its last word ends (#6792)
* fix(registry): caption components keep the last phrase until its last word ends

* test(registry): caption last group stays visible until its last word ends

* test(registry): narrow the timeline lookup for strict typecheck
2026-10-30 06:07:40 +00:00
Miguel Ángel b3c47a36a2 fix(cli): snapshot probes each video clip once for all the times it is asked for (#6798)
* fix(cli): snapshot probes each video clip once for all the times it is asked for

* style(cli): drop the probe cache's added comment lines so the comment ratchet holds
2026-10-30 06:07:40 +00:00
Miguel Ángel 3e795ece0f fix(cli): preview stops at once on Ctrl+C after Studio was open (#6782)
* fix(cli): preview stops at once on Ctrl+C while a Studio tab is open

* fix(cli): a closed Studio tab leaves no timer that holds a stopping preview open

* fix(cli): name the tab-closed wait instead of commenting it

* test(cli): the tab-disconnect test checks the route's own keep-alive timer, not every timer
2026-10-30 05:58:35 +00:00
Miguel Ángel 27e16becb1 test(cli): a failed late-image snapshot reports why it failed (#6793)
* test(cli): a failed late-image snapshot reports why

* test(cli): the late-image failure message includes the JSON the command printed
2026-10-30 05:45:03 +00:00
Miguel Ángel 7f7a4af7c4 fix(cli): add takes several names in one call, and adopted audio is labelled voice or sfx (#6791)
* fix(cli): adopted audio is labelled voice or sfx by its folder or file name, not always bgm

* fix(cli): let the audio kind helper's name carry the rule

* feat(cli): add installs several named items in one call

* fix(cli): split add's per-item install, and keep soundfx folders as sfx
2026-10-30 05:35:50 +00:00
Miguel Ángel 8c36f3254f fix(cli): check no longer flags a hidden scene child or a small animated sprite (#6783)
* fix(lint): a scene child hidden at zero through a scoped query is not an overlay that starts visible

* fix(lint): a descendant selector inside a scoped query hides the overlay too

* fix(cli): check sees a small sprite move across a large canvas

* style(cli): wrap the media pixel channel comment

* fix(cli): only the liveness signature samples canvases finely, the sweep guard stays coarse
2026-10-30 05:11:06 +00:00
Miguel Ángel 21eefcd006 fix(cli): hyperframes docs motion-blur shows the motion blur guide (#6779)
* fix(cli): hyperframes docs motion-blur shows the motion blur guide

* docs(cli): list the motion-blur topic in the docs command reference
2026-10-30 03:55:29 +00:00
Miguel Ángel 360ca9cf61 chore: release v0.8.220 (#6781) 2026-10-30 03:37:22 +00:00
Miguel Ángel 6b7e2c96eb ci(windows): split the engine-cli test lane into two shards (#6670)
* ci(windows): split the engine-cli test lane into two shards

* test(cli): the agent-mode test runs alone, after the files it starved
2026-10-30 03:37:15 +00:00
Miguel Ángel a66b2c8035 fix(cli): anonymous hosts and host in-points move a caption word's lifetime window (#6774)
* fix(cli): anonymous hosts and host in-points move a caption word's lifetime window

* fix(cli): a host's end and playback-start are read like the runtime reads them
2026-10-30 02:56:28 +00:00
Miguel Ángel 0a18d8c350 fix(cli): browser clear reports a browser folder Windows still holds (#6776)
* fix(cli): browser clear still reports a folder Windows holds, and the EBUSY test covers EPERM

* fix(cli): browser clear reports a locked browser folder, with a test that fails if it does not
2026-10-30 02:38:16 +00:00
Miguel Ángel d1c0593717 fix(cli): text-to-speech ignores a foreign PYTHONPATH when it looks for kokoro-onnx (#6769)
* fix(cli): text-to-speech ignores a foreign PYTHONPATH when it looks for kokoro-onnx

* fix(cli): shorten the pythonEnv comment

* fix(cli): text-to-speech keeps a deliberate PYTHONPATH unless the packages fail with it

* fix(cli): drop the python.ts comments the names already say
2026-10-30 02:25:39 +00:00
Miguel Ángel a30a520970 chore: release v0.8.219 (#6775) 2026-10-30 02:07:39 +00:00
Miguel Ángel f523ee2fca fix(cli): check flags caption words hidden behind a cut-out and ignores a mostly transparent cover (#6770)
* fix(cli): check flags caption words hidden behind a cut-out and ignores a mostly transparent cover

* fix(cli): a caption word's lifetime is shifted only by its composition hosts
2026-10-30 01:47:19 +00:00
Miguel Ángel 6874cc2890 fix(cli): a locked Chrome debug.log on Windows no longer fails check, snapshot or render (#6771) 2026-10-30 01:27:29 +00:00
Miguel Ángel 9c01e2e121 fix(cli): normalize-audio never cuts a clip that is quieter than the target (#6767)
* fix(cli): normalize-audio never cuts a clip that is quieter than the target

* fix(cli): carry the boost-hold rule in a name, not a comment

* fix(cli): normalize-audio no longer says a clip is matched when a limit holds it short of the target

* fix(cli): format normalize-audio, drop the extra comment, and say a held clip is held
2026-10-30 01:21:53 +00:00
Miguel Ángel aa094f3858 fix(cli): render with no -o writes to the project's renders folder from any directory (#6766) 2026-10-30 00:47:28 +00:00
James Russo f7db6ba40c chore: release v0.8.218 (#6758) 2026-10-29 23:31:55 +00:00
Miguel Ángel d81099b1ff fix(cli): Apple Silicon skips an ffprobe or ffmpeg that cannot run and names it (#6760)
* fix(cli): Apple Silicon Macs without ffmpeg get working arm64 ffprobe and ffmpeg

* fix(cli): drop the bundled ffmpeg installers, name the x86-only binary it skipped
2026-10-29 23:20:11 +00:00
James Russo 3e462f4277 feat(cli): use dedicated HyperFrames OAuth clients (#6687)
* feat(cli): use dedicated HyperFrames OAuth clients

* docs(cli): shorten credential store contract comment

* fix(cli): respect Windows modes in OAuth media test

* fix(cli): keep media workflows on HyperFrames OAuth

* test(cli): scope billing status assertions to wallet rows

* test(cli): align telemetry fixtures and CI auth inputs
2026-10-29 21:25:20 +00:00
Miguel Ángel 4e2a1c215a chore: release v0.8.217 (#6751) 2026-10-29 15:13:36 +00:00
Miguel Ángel b320a66d51 test(cli): a stalled download times out once its bytes are on disk, not on a clock (#6750)
* test(cli): stalled-download tests give each stall time for its bytes to reach disk

* test(cli): a stalled download times out once its bytes are on disk, not on a clock
2026-10-29 14:59:11 +00:00
Miguel Ángel 558097ed70 fix(cli): check no longer calls a redrawn WebGL canvas a dead stretch (#6749)
* fix(cli): check no longer calls a redrawn WebGL canvas a dead stretch

* fix(cli): keep the seek comment under the line limit
2026-10-29 14:34:07 +00:00
Miguel Ángel 838f8782c4 fix(cli): a project .env only sets the CLI's own settings (#6565)
* fix(cli): a project .env only sets the CLI's own settings

The .env in the working directory could set any environment variable for every
command except capture. It now sets only the keys the CLI reads from a project:
the HeyGen, ElevenLabs and Figma credentials and the vision keys, models, Vertex
settings and timeout. Other keys are ignored, and one stderr line names them.

* test(cli): the startup test and comment budget follow the single project .env key list

* fix(cli): a project .env can still turn telemetry off
2026-10-29 12:41:46 +00:00
Miguel Ángel 943849025a feat(cli): a render that finds a file missing says which kind of file, never its path (#6742) 2026-10-29 12:03:09 +00:00
Miguel Ángel 1a80b5407d fix(cli): allow-occlusion on the covering element silences text_occluded (#6741)
* fix(cli): allow-occlusion on the covering element silences text_occluded

* fix(cli): allow-occlusion also works on graded video and does not excuse a card's own text
2026-10-29 12:00:55 +00:00
Miguel Ángel 0da46832ef fix(cli): a failed render's code comes only from the producer's list of safe codes (#6737) 2026-10-29 10:31:22 +00:00
Miguel Ángel 94203ad431 fix(cli): snapshot says FFmpeg was stopped when it exits 255 with no output (#6718)
* fix(cli): snapshot says FFmpeg was stopped when it exits 255 with no output

* style(cli): drop a doc comment the comment ratchet counts
2026-10-29 10:15:31 +00:00
Miguel Ángel eab6541f5b feat(cli): a feedback report names why the last check failed (#6717)
* feat(cli): a feedback report names why the last check failed

* fix(cli): feedback names a check that threw or never finished, with when it ran

* fix(cli): feedback says how old the last check is
2026-10-29 10:10:58 +00:00
Miguel Ángel 6df754fbf3 chore: release v0.8.216 (#6735) 2026-10-29 10:01:01 +00:00
Miguel Ángel 077de9bfe9 test(cli): the publish abort test checks the summary hint is absent (#6726) 2026-10-29 07:37:49 +00:00
Miguel Ángel ba8ffffa0b fix(cli): a failed render names its failure code for the Desktop app (#6725) 2026-10-29 07:36:32 +00:00
Miguel Ángel cf15892425 fix(cli): a snapshot still shows what playback shows, whatever other times are asked for (#6720)
* fix(cli): a snapshot still shows what playback shows, whatever other times are asked for

* test(cli): pin that still-capture pages ask for the skipped-frame replay
2026-10-29 06:44:51 +00:00
Miguel Ángel 98a28cc4b2 fix(cli): the lint summary points at hyperframes lint, not a flag only render takes (#6723) 2026-10-29 06:44:01 +00:00
Miguel Ángel 17f5d67643 chore: release v0.8.215 (#6719) 2026-10-29 06:19:54 +00:00
Miguel Ángel bb4deb8014 fix(cli): an unknown command like search says which command does that (#6710)
* fix(cli): an unknown command like search says which command does that

* fix(cli): the synonym hint is checked before the spelling match, so list, find and browse reach it
2026-10-29 05:03:43 +00:00
Miguel Ángel 2f8c4b1daf fix(cli): check says how many browser-playable copies are done while it makes them (#6712) 2026-10-29 05:02:58 +00:00
Miguel Ángel 11312b359b fix(cli): check says a lint error is why the browser pass was skipped (#6709)
* fix(cli): check says a lint error is why the browser pass was skipped

* style(cli): drop a doc comment the comment ratchet would count
2026-10-29 04:08:41 +00:00
Miguel Ángel f0c5db6ea2 fix(cli): capture names the network's proxy when it refuses the connection to the site (#6706)
* fix(cli): capture names the network's proxy when it refuses the connection to the site

* fix(cli): capture words a refused tunnel and an unreachable proxy apart, and echoes no raw address

* fix(cli): shorten the proxy failure comment
2026-10-29 04:08:34 +00:00
Miguel Ángel 6c17659337 fix(cli): check waits as long as the --timeout it was given before it counts as idle (#6705)
* fix(cli): check waits as long as the --timeout it was given before it counts as idle

* style(cli): shorten a comment line

* style(cli): drop the idleWindow doc comment the comment ratchet counts
2026-10-29 04:08:29 +00:00
James RussoandClaude Opus 5.5 1c3fcf4d23 feat(telemetry): identify signed-in CLI users by their HyperFrames user id, and say signed-in usage is not anonymous (#6703)
* docs(telemetry): say signed-in usage is linked to your account, not anonymous

After hyperframes auth login the CLI sends a PostHog $identify with the
account email (username as fallback) and merges the install's earlier
anonymous usage; media-use does the same when it finds a signed-in
account. Several places still called all telemetry anonymous. Say it is
anonymous until you sign in, in the CLI reference (media-use, --skill,
feedback, events, telemetry), the hyperframes-cli skill references, and
the CLI help and notice strings.

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

* feat(telemetry): identify signed-in CLI users by their HyperFrames user id

The CLI and media-use identified a signed-in install by account email, so
CLI usage landed on a different PostHog person than the same account in
the HyperFrames web app, which keys on toUUID(username). Identify by that
same sha256-derived id instead, and $set email plus heygen_username on the
person. heygen_username is the cross-project join column for the Snowflake
event table (HeyGen's own project stores it as `name`). An account with no
username still falls back to the lowercased email.

Notices and docs now say usage is keyed on an id derived from the username
with email and username stored on it.

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

* chore(telemetry): trim comments to the package's comment share

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

* feat(telemetry): put heygen_username on every event while signed in

The Snowflake event sync may not carry PostHog person properties, so a
$set alone does not let an event row join across projects. The CLI now
adds the signed-in HeyGen username (raw, from ~/.heygen/credentials) to
every event and drops it once the credentials hold no user; media-use
does the same on each event it sends.

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

* ci: count auth/paths.ts as an edit-accuracy bench input

Telemetry now imports it to read the signed-in username.

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

* fix(telemetry): stat and read the credentials through one file handle

CodeQL flagged the stat-then-read as a file system race.

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

* fix(telemetry): key signed-in events on the account id; fix stale anonymity copy

Genesis review on #6703:
- telemetry --help listed 'Any personally identifiable information' as
  never collected, and media-use's meta.md still said anonymous.
- Installs already identified by email under an older CLI never merge
  into the new person, so send signed-in events with distinct_id = the
  account id (back to the install id after logout), in the CLI and in
  media-use, and stop claiming earlier usage always merges.
- A user block with no credential no longer counts as signed in.
- A UUID-shaped username passes through unhashed, as on the web.

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

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-29 02:57:48 +00:00
Jerrai 4fa5f54519 fix(cli): audio windows read beats off the whole clip; beats snap to the signal and mark silence (#6692)
* fix(cli): audio windows read beats off the whole clip; beats snap to the signal and mark silence

A film query that covers part of a clip measures beats, downbeats, bpm and sections on the
whole clip and cuts them to the window, as #6653 did for kind, so a window under 6 s still
has its beats.

One step after every provider ladder moves a provider's beats and downbeats onto the
signal's own beats within a quarter beat (the snapping api did alone) and marks each with
`silent`, true where the beat falls in silence. Beats are marked, never dropped; the JSON
change is the additive `silent` array.

— Jerrai

* fix(cli): beats with no pulse are unheard; a window with none answers no steady beat

Review fixes for #6692:
- The per-beat flag is now `unheard` (renamed from `silent`, not released): true in silence
  or where no onset falls within 50 ms of the beat, so hiss, room tone or a held pad no
  longer pass as beats.
- A window keeps the whole clip's beats only when at least two of its beats are heard;
  otherwise it answers "no steady beat" as before, with no downbeats and no bpm.
- A window's bpm is the tempo of its heard beats, never the whole clip's.
- Comment lines trimmed so analyze.ts, run.ts and api.ts are at or under main's share.

— Jerrai

* fix(cli): a beat is unheard only where two beats in a row have no onset

Scored on the ground-truth set, flagging every onset-less beat also flagged heard beats the
onset detector misses: the drop downbeat after a snare roll, single beats under narration,
quiet beats late in a fade. A pulse gap now needs two onset-less beats in a row; hiss, room
tone and held pads span many beats and stay flagged, and silence is flagged as before.

— Jerrai

* fix(cli): a window with no pulse on the clip's grid reads its own beats, as before

Genesis found a window over a section far under the clip's loudest part answered "no steady
beat" where main, reading the window alone, found every beat: the clip's grid and onsets
skip a section that quiet (from about 40 dB under, for clicks). When a window keeps fewer than
two heard beats from the clip's grid, its beats, downbeats and bpm now come from the window
alone, as they did on main. Hiss still answers "no steady beat" on its own.

The hiss test's noise() repeats every 10,466 samples (0.22 s at 48 kHz), which the window's
own reading took for a pulse; that test now uses a xorshift generator.

— Jerrai

* fix(audio): unheard comes from level-free rhythm evidence, so quiet music stays heard

A beat was flagged by an absolute -50 dBFS silence and by onsets under 10% of the clip's
loudest hit, so music 30 dB or more under the loudest part read as unheard. Now:
- core localBeatEvidence reads the cached standardised onset curve over the 6 s around each
  beat: the tracker's steady-beat confidence there (clarity at the local beat lag times the
  beat's own lift) and the beat's lift over the span's mean.
- A beat is unheard in digital silence (-80 dBFS), or when its span keeps no steady beat
  (confidence under 0.15) and its own onset does not stand out (lift under 1.5). Lift alone
  keeps beats under narration heard, where syllables lower the span's clarity.
- A window keeps the clip's beats when at least two, and at least half, of them are heard.

— Jerrai
2026-10-29 01:52:48 +00:00
Miguel Ángel a5496b1887 fix(producer): a BeginFrame capture that draws no first frame in 20 s switches to screenshot (#6701)
* fix(producer): a BeginFrame capture that draws no first frame in 20 s switches to screenshot

* test(cli): cover the Chrome launch failure messages a failed render prints
2026-10-29 00:49:04 +00:00
Miguel Ángel cfa653af4d fix(cli): media-treatment --capability preset finds the presets area (#6700) 2026-10-28 23:27:27 +00:00
Miguel Ángel ac449555f4 fix(cli): a Windows render no longer prints taskkill's already-exited message (#6698)
* fix(cli): a Windows render no longer prints taskkill's already-exited message

* fix(cli): fold the taskkill note into the hidden() doc comment
2026-10-28 23:04:48 +00:00
Miguel Ángel 0620067eb0 fix(cli): snapshot reads https video in the Desktop app instead of failing at ffprobe (#6699)
* fix(cli): snapshot reads https video in the Desktop app instead of failing at ffprobe

* fix(cli): give a remote clip download the same 30 s a stalled host had before
2026-10-28 22:52:28 +00:00