mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-10-30 09:16:55 +00:00
* refactor(skills): fold six domain skills into hyperframes and media-use guides
hyperframes-core, -animation, -keyframes, -creative and -studio move to
skills/hyperframes/{core,animation,keyframes,creative,studio}/, and
hyperframes-audio moves to skills/media-use/mix/. Each moved SKILL.md becomes
a frontmatter-free GUIDE.md so installers that scan recursively for SKILL.md
no longer see them as skills; the published list goes from 21 to 15.
Relative links, code paths and skill-name mentions are rewritten to the new
locations, the catalog surfaces, marketplace core-skills list, fallback core
set, module-copy targets and skills-manifest.json follow, and
`hyperframes skills update` now removes the retired skills (RETIRED_SKILLS)
when they are still installed.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat(skills): slim the core entries and give media-use a HeyGen and a free path
The four entries every run opens are rewritten to what an agent cannot infer:
hyperframes 21.8 KB to 7.7 KB, hyperframes-cli 24.8 KB to 6.9 KB,
hyperframes-registry 9.9 KB to 4.3 KB, media-use 9.7 KB to 4.9 KB. Detail moved
whole into references (routing close calls and creator edits, CLI pin upgrades,
catalog search tiers, CLI conventions and feedback reports).
- hyperframes: state table, routing, the render contract, a terminal work loop
(check, snapshot, preview before render), the desktop-app hand-off, and a
table of the folded guides.
- media-use: one table of HeyGen versus free local tools per need; HeyGen
sign-in, credits and the CLI's video-agent, avatar, clone, lipsync, translate
and clipping commands; every free path works with no account.
- scripts/check-core-skills.mjs holds entries and descriptions to budget and
checks every taught `npx hyperframes` command and path; runs in lint.
- Core entries are exempt from the formatter: its table padding cost ~1.5 KB
per entry on every run.
- Content tests follow the text to its new home.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(skills): plugin runs skip skills update; media-use explains HeyGen sign-in and TTS setup
The smoke eval showed a presenter request never reaching media-use and the
free voiceover failing on a missing kokoro-onnx; plugin runs also ran the
skills update the plugin rules forbid.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* chore(skills): drop a committed Python bytecode file and ignore bytecode
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat(skills): align the entry with the Studio skills and keep the workflows' measured facts
The entry drops routing and the intent interview and carries the contract, the
editable-project rules and the work loop. Studio's format, runtimes, motion,
look and captions references come over for terminal use, frame presets move to
assets/, media-use gains Studio's mixing and local-command references, and
film.md and overlays.md keep what the workflow skills measured.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat(skills)!: retire the workflow skills and folded guides; publish seven knowledge skills
The skill pack now publishes exactly seven skills - hyperframes,
hyperframes-cli, hyperframes-registry, media-use, figma, slideshow and
remotion-to-hyperframes - carrying knowledge, not process. The eight
workflow skills, the folded domain guides and the routing/interview
references are deleted; their measured facts already live in the
hyperframes references (format, runtimes, motion, look, captions, film,
overlays) and media-use's mixing reference.
- bake-basemap.mjs and locate.mjs move to skills/hyperframes/scripts/
(bake-basemap gains --help); extract-audio-data.py moves to
media-use/audio/scripts/ for the caption motion reference.
- skills update: the eight workflows join RETIRED_SKILLS so existing
installs prune them (by lock attribution only, since their names are
generic); naming a retired skill reports where its knowledge went and
succeeds instead of failing as unknown.
- Capture prompts point at the hyperframes skill's references/film.md;
the live-map warning names the new bake-basemap path.
- Content tests that pinned knowledge are retargeted to the kept
references; tests of deleted workflows, scripts and process go.
- Catalog surfaces, templates and docs describe the seven skills.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(skills): resolve the local.md captions link and allow capture's output files in citations
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(skills): regenerate the skills manifest from tracked files only
The committed media-use hash included an ignored __pycache__ bytecode file present
in the local checkout, so CI's clean checkout hashed differently.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(docs): restore generated catalog pages and docs navigation to main
Catalog PRs commit item sources only; CI regenerates the pages from the edited
registry sources. docs/docs.json is catalog navigation, so its Workflows group
rename is left for a non-catalog PR.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* build(cli): raise the CLI size budget for the skill references it bundles
The CLI bundles skills/hyperframes, which now carries the folded domain guides and
frame presets (155 KB to 1.08 MB in git). Budgets are the CI-measured size plus 5%:
packed 7526634, unpacked 22593213.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* test: keep repo-sweep guards meaningful after the workflow skills left
The last shell ffprobe caller and most root index.html examples lived in retired
skills. The shell detector is now pinned on a literal command line, and the
structure-rule sweep needs more than 5 roots (11 remain) rather than 30.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat(skills): slim figma, slideshow and remotion to the Studio shape; restore the storyboard board
slideshow 33.5 KB to 4.9, figma 18.2 to 6.2, remotion-to-hyperframes 11.0 to
4.9, each keeping the facts only it holds (the figma motion helpers, verify gate,
storyboard decoding and usage beacons; present and hand-off; the Remotion lint,
SSIM check and API map). The board page format from the storyboard recipe comes
back as hyperframes/references/storyboard.md: the desktop app's Storyboard tab
reads boards/storyboard.html by its frame, title and time classes. The entry and
the init template now say to snapshot the moments an edit changed before
replying, which the terminal eval found skipped in 22 of 38 runs.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(skills): manifest without local bytecode; Studio's edit prompt names kept files
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(skills): render when the person asks for the file or for no stops, not only after approval
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(skills): keep the voiceover carve in media-use; presets stage their own fonts
Review follow-ups on #5651:
- carve.mjs and its tests move to skills/media-use/audio/scripts; the audio
docs, mixing.md and two Studio comments point there.
- code-editorial's FRAME.md says to copy its bundled WOFF2s and add the
@font-face blocks, instead of promising the retired build-frame.mjs.
- media-use states the host rule before the HeyGen sign-in steps.
- storyboard-format marks transition_in as a note the agent builds itself.
- Two stale citations (creator-editing-recipes.md, sub-compositions.md).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* chore(skills): regenerate the manifest without local bytecode
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(skills): the CLI render step follows step 4's rule, not approval alone
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(ci): run the core-skills check from lint again after the main merge
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat(skills): films that tell a story start from three storylines; maps use real imagery
Opus 5.5 arm D read motion.md and applied it, but its launch film was a
feature list (pain, three feature cards, proof, logo): film.md left story
to the model. And the map case never opened film.md, so it drew Natural
Earth outlines instead of baking satellite tiles.
- references/story.md: the generic half of Studio's moment-film story and
craft (one thing, three storylines with world and device, the hook,
beats, worlds, copy, brand, tells of a generated film). The person picks
a storyline, or the agent takes its recommendation when asked for the
file or for no stops.
- The entry's work loop names the storyline step for films over ~15 s; the
references table routes stories to story.md and maps to film.md.
- film.md points at story.md and gives maps and real places a section.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(skills): story.md follows the entry: no voiceover unless asked
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(skills): bake-basemap starts from a globe and stops waiting out its idle timeout
The Opus 5.5 map run spent 13 of its 38 minutes on parallel bakes that
stalled and 15 more recording 300 frames, after rewriting the script because
it could only start on a flat map.
- PROJECTION=globe with a seeded starfield and atmosphere, and FROM/PAN to
turn the globe to CENTER before the dive.
- Each frame polls for loaded tiles instead of waiting for an "idle" event
that had often already fired: 30 frames went from 198-219 s to 10-13 s
locally with byte-identical frames.
- Progress prints seconds a frame and minutes left; film.md shows the globe
call and says to run one bake at a time.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(skills): render in the foreground; wait on a detached render's log, never pgrep -f
Both Opus 5.5 explainer runs started a detached render, then waited with
`until ! pgrep -f "hyperframes render"`, which matches its own loop: each
render took 88-117 s and the wait sat for the tool's full 10 minutes.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat(skills): route each kind of film; storylines carry look and sound; add review and sound
The entry routes by request (launch, explainer, music, data, vertical, 3D,
character) to a self-contained file under references/types/, and a film
over ~15 s now gets music and sounds on its visible actions unless the
person asked for silence. Each storyline names its look and its sound, so
picking one picks both; STORYBOARD.md frames carry `reads` and `sound`.
review.md is the whole-film pass: the check warnings, the review sheets,
seven questions to look for, P0/P1/P2 notes and REVIEW.md. motion.md gains
eases by role, six title entrances, a reading-time rule and nine measured
transitions; look.md a design plan before the first scene, with presets
kept for decks and named picks. story.md adds the second default that
generated design falls into, with what to do instead.
The blank template and format.md no longer teach the fade-and-slide-up
entrance on a dark canvas.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat(cli): check warns on unread lines, dead stretches, small type, empty frame 0 and silence
A coding agent cannot watch its film, so check now measures what a viewer
notices over time. A new `craft` section holds warnings only (exit 0
unless --strict), sampled on the dense 8 fps grid the overlap pass
already seeks, skipped for --range checks:
- line_unread: a reading-size line (>= 30 px tall at 1080) on screen
under 0.4 s for 1-2 words, else under 3/4 of 0.5 s + 0.3 s a word;
the film's last line needs 2 s. Short lines are re-measured between
samples to ~0.01 s before judging. Captions-track and
data-layout-ignore text are exempt.
- dead_stretch: more than 3 s where the keepsMoving liveness signature
does not change, outside the final 3 s and any data-hold element;
quiet when sweep_static fires or a whole-composition keepsMoving
assertion owns the limit.
- text_below_floor: text under 2.6% of the short side (28 px on 1080)
held 0.5 s, one finding per file listing every element.
- first_frame_empty: frame 0 paints only the background.
- film_silent: over 15 s with no unmuted audio or audible video.
Each message names the fix and the skill reference to read. keepsMoving
now also leaves the film's last 3 s (a still end card) out of its
static runs, so the two agree.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat(cli): snapshot --review captures a beat sheet, seam strips and a phone sheet
snapshot --review picks the frames that show a film over time instead of
evenly spaced ones, in the same single browser session:
- review-beats.jpg: one settled frame per scene at its start + 0.3 s,
plus one per timed data-beat="name" element, labelled time and id.
Scenes are the composition's top-level timed clips and sub-composition
hosts, read like `timeline` reads rows (captions and audio excluded)
and timed by the runtime's start resolver over the live page.
- review-seam-NN.jpg: frames at -0.2, -0.1, 0, +0.1, +0.2 s around
every cut (each scene start, and any scene end no scene starts at).
- review-phone.jpg: the beat frames at 360 px wide.
--composition scopes the review to one sub-composition; with fewer than
two scenes the beats spread evenly and a note says so. snapshot also
gains --json: one envelope with every frame's path and time and, under
--review, the scenes, beats and seams behind the sheets; progress moves
to stderr.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(cli): craft warnings stay out of --strict; a hold gets a real next action, not a caret
Craft findings (unread lines, dead stretches, small type, an empty first
frame, silence) are judgment calls a film may break on purpose, so
--strict keeps gating defects only. The check reference no longer
suggests a blinking caret to keep a still frame moving.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(cli): review spreads beats when every scene starts together; map credits skip the type floor
A map film whose basemap and overlay both start at 0 s got one beat
frame; the even spread now keys on distinct scene starts. film.md tells
agents to mark the imagery credit data-layout-ignore and back it, since
the new type floor flagged it on the first real run.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(cli): review frames each scene at its middle too, not only 0.3 s in
On the first real explainer, 0.3 s into a scene showed a bare colour
field before its title entered. Each scene longer than about a second
and a half now adds a frame at its middle, so the sheet shows what the
scene builds.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat(skills): a film is built from a numeric SPEC.md, with defaults banned by name and a look test
Studied in full: flxrnc's Motion Lab (vague vs directed prompt), 0xMovez's
course, EianLu's riso skill, agentchengfeng's style samples and the two
Opus 5.5 guides. Their common point: adjectives are where the default look
lives, so the agent now writes SPEC.md before any scene (GOAL, OUTPUT,
TIME, LOOK, MOTION, SHOTS, BANNED, QA), with a number for every adjective.
spec.md bans the defaults by name, unless the brand or reference uses
them (a dark void with small things floating, glow and particles, the
cream-serif-mono-label look, fade-and-slide-up, corner brackets), and
grows that list after the first render. Each storyline gets a 3 s test of
its hero shot before the pick; a look is written as the rules of one
medium. Composition numbers: the hero fills 40% of the frame, one hero
move per shot, the shot's information in within 2.5 s then a held poster.
motion.md adds springs by damping ratio, shorter exits, overlap, stagger
and the beat grid; review.md reviews as a harsh director and grows BANNED;
vertical.md takes the riso skill's measured safe band; explainer.md the
shapes of information.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(skills): story before look; every object reads as itself; posters only for info cards
The first spec-driven C02 swapped the dark default for a flat Swiss
poster, and the story went with it: two black bars nobody read as mirrors,
slogans instead of cause and effect, a storyline picked for its picture.
The spec now serves the story: a storyline is picked for the story a
stranger would follow, the look test asks first whether a stranger
understands what they see, and SPEC.md gains an OBJECTS line giving each
thing the material and details that make it read without a label. The
2.5 s held-poster rule is limited to information cards; in a story film
every shot causes the next. Explainers start from a person or situation
the viewer knows. Review names every object as a stranger would and
treats one that needs explaining as a P0.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(skills): storylines are three films in words, each with a device and a form
The three storylines are pitched as text and the person picks from them;
nothing is built for a storyline before the pick, so the 3 s hero-shot
look test is gone. Ideas pair a device with a form, five or more first,
keeping the three that differ most, and the one stop states the rest in
an assumption line that names every paid item beside its free option.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* ci: list main's new embedded-captions hf-cli test among the retired workflow files
The merge with main removed it with the rest of the retired skill, and the
deletion guard rejects any removal it has not been told about.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(core): keep the audio preset comment within core's size budget
The comment's new citation to media-use's mixing reference made the published
package 14 bytes larger than its budget, which sits at main's exact size.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(cli): craft keeps its own 8 fps grid; comments back within the checks
Review on #5651 found that the merge moved craft onto the overlap pass's
times, which main caps at 180, so a brief line in a long film fell between
samples and line_unread missed it. Craft now builds its own grid at 8 fps up to
600 samples, as before the merge, and a 60 s film with a line shown for 0.2 s
pins it.
The Comments check passes again: REVIEW.md and STORYLINES.md join the files a
skill writes into a project, the comment lines this branch added come back
under each file's share at the merge-base, and the audio preset comment drops
a word the check reads as history.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1056 lines
60 KiB
JSON
1056 lines
60 KiB
JSON
{
|
||
"$schema": "https://raw.githubusercontent.com/fallow-rs/fallow/main/config-schema.json",
|
||
"entry": [
|
||
// IconButton, Tabs and cn are exported before their first consumer exists.
|
||
"packages/studio/src/components/ui/index.ts",
|
||
"packages/producer/src/**/*.test.ts",
|
||
// Studio's browser-journey helpers are plain .mjs under tests/e2e; their unit tests live beside them.
|
||
"packages/studio/tests/e2e/**/*.test.mjs",
|
||
"packages/aws-lambda/src/**/*.test.ts",
|
||
"packages/gcp-cloud-run/src/**/*.test.ts",
|
||
"packages/gcp-cloud-run/terraform/*.test.ts",
|
||
// Inspector is a private Bun service with CLI-driven browser contract
|
||
// scripts; its runtime module is bundled by file path into the page.
|
||
"packages/inspector/src/{service,server,mcp}.ts",
|
||
"packages/inspector/src/liveRuntime.ts",
|
||
"packages/inspector/tests/*.ts",
|
||
"packages/core/src/runtime/inspection.ts",
|
||
"packages/producer/src/regression-harness.ts",
|
||
"packages/producer/src/regression-harness-distributed.test.ts",
|
||
"packages/producer/src/regression-harness-lambda-local.ts",
|
||
"packages/producer/src/transparency-test.ts",
|
||
"packages/producer/src/parity-harness.ts",
|
||
"packages/producer/src/parity-fixtures.ts",
|
||
"packages/producer/src/perf-gate.ts",
|
||
"packages/producer/src/runtime-conformance.ts",
|
||
"packages/producer/src/benchmark.ts",
|
||
"packages/core/scripts/generate-font-data.ts",
|
||
"packages/producer/we-render.mjs",
|
||
"packages/producer/scripts/validate-fast-video.ts",
|
||
"packages/cli/scripts/generate-font-data.ts",
|
||
"packages/engine/scripts/test-fitTextFontSize-browser.ts",
|
||
"packages/aws-lambda/scripts/*.ts",
|
||
// Built as standalone IIFE for the browser-side sandbox runtime;
|
||
// referenced by file path (not import) in build-hyperframes-runtime-artifact.ts.
|
||
"packages/core/src/runtime/entry.ts",
|
||
// Bundled as a standalone IIFE by the position-edits render artifact
|
||
// generator; referenced by file path rather than imported by TypeScript.
|
||
"packages/core/stubs/position-edits-render-entry.ts",
|
||
// Same arrangement for the audio FX graph builders, bundled by
|
||
// build-audio-fx-runtime.ts for the offline render page.
|
||
"packages/core/stubs/audio-fx-runtime-entry.ts",
|
||
// And for the SVG selector alias installer compiled scene scripts carry.
|
||
"packages/core/stubs/svg-selector-aliases-entry.ts",
|
||
// In-page audit scripts read as raw strings and injected via
|
||
// page.addScriptTag (see layout.ts / validate.ts) — referenced by file
|
||
// path, never imported, so they have no import-graph referrer.
|
||
"packages/cli/src/commands/layout-audit.browser.js",
|
||
"packages/cli/src/commands/contrast-audit.browser.js",
|
||
"packages/cli/src/commands/motion-sample.browser.js",
|
||
"packages/cli/src/commands/motion-signature.browser.js",
|
||
// Worker entry points loaded dynamically by their *Pool.ts companions.
|
||
"packages/producer/src/services/pngDecodeBlitWorker.ts",
|
||
"packages/producer/src/services/shaderTransitionWorker.ts",
|
||
// Off-main-thread /health endpoint, spawned by path from healthWorker.ts.
|
||
"packages/producer/src/services/healthWorkerThread.ts",
|
||
// Render-setup worker, spawned by path from cancellableProcess.ts.
|
||
"packages/cli/src/renderSetupWorker.ts",
|
||
// Update/skills cache refresh, spawned detached by path from backgroundChecks.ts.
|
||
"packages/cli/src/backgroundChecksWorker.ts",
|
||
// Parakeet decode worker, spawned by path from whisper/sherpa.ts.
|
||
"packages/cli/src/whisper/sherpaWorker.ts",
|
||
// Warm-check client, spawned by path from warmCheck.process.test.ts.
|
||
"packages/cli/src/warmCheckClient.fixture.ts",
|
||
"packages/cli/src/browser/chromeOrphans.fixture.ts",
|
||
"packages/cli/src/capture/publicNetwork.fixture.ts",
|
||
"packages/cli/src/utils/commandResult.fixture.ts",
|
||
// Test fixture worker, spawned by path via the pools' workerEntryPath
|
||
// option from the crash-recovery tests; has no import-graph referrer.
|
||
"packages/producer/src/services/__fixtures__/crashOnMessageWorker.mjs",
|
||
"scripts/**/*.{ts,mjs,js}",
|
||
"scripts/*/run.mjs",
|
||
// Keyframe UI components — wired dynamically via EaseCurveSection/MotionPanel.
|
||
"packages/studio/src/components/editor/KeyframeDiamond.tsx",
|
||
"packages/studio/src/components/editor/SpringEaseEditor.tsx",
|
||
// NLE notice — rendered conditionally via NLEContext/EditorShell when timeline is first shown.
|
||
"packages/studio/src/components/nle/TimelineEditorNotice.tsx",
|
||
// Zoom hook extracted for downstream razor-blade PRs (#1330, #1331).
|
||
"packages/studio/src/player/components/useTimelineZoom.ts",
|
||
// Preview helper consumed dynamically from the studio iframe bridge.
|
||
"packages/studio/src/hooks/gsapRuntimePreview.ts",
|
||
],
|
||
"ignorePatterns": [
|
||
"docs/**",
|
||
// Chrome browser binaries downloaded by puppeteer — not project source.
|
||
"chrome/**",
|
||
// Standalone spike scripts and benchmark runners used during R&D.
|
||
"packages/engine/spikes/**",
|
||
"packages/producer/de-*.mjs",
|
||
"packages/producer/tests/**",
|
||
"packages/player/tests/**",
|
||
"packages/engine/tests/**",
|
||
"skills/**/test-corpus/**",
|
||
"skills/**/scripts/**",
|
||
// The relocated media-use .mjs files are agent-invoked scripts outside the
|
||
// import graph; keep the exemption scoped to that shipped script type.
|
||
"packages/cli/src/media-use/**/*.mjs",
|
||
// Bundled @font-face data (read at runtime via fs.readFileSync, invisible
|
||
// to the import graph) + its manual rebuild tool.
|
||
"skills/**/fonts/**",
|
||
// Golden snapshot files: data consumed by toMatchFileSnapshot, not importable modules.
|
||
"packages/**/__goldens__/**",
|
||
"registry/**",
|
||
// Browser fixture HTML loads generated player bundles that exist only after the package build.
|
||
"packages/core/src/runtime/fixtures/deck-audio-demo.html",
|
||
// Browser test intentionally contains repeated inline scenarios for distinct failure paths.
|
||
"examples/**",
|
||
"packages/sdk/examples/**",
|
||
".github/workflows/fixtures/**",
|
||
// Auto-generated TS client for the HeyGen cloud API. Regenerated by
|
||
// experiment-framework/scripts/generate_hyperframes_cli_client.py via
|
||
// the sync-hyperframes-codegen.yml workflow; complexity/dead-code
|
||
// findings on this file are not actionable from this repo.
|
||
"packages/cli/src/cloud/_gen/**",
|
||
// Published launcher imports generated dist files that do not exist in a source checkout.
|
||
"packages/cli/bin/**",
|
||
],
|
||
"ignoreExports": [
|
||
// Browser helper public API, paired with elementMap.d.ts and consumed by
|
||
// external harnesses rather than another workspace package.
|
||
{
|
||
"file": "packages/inspector/src/elementMap.js",
|
||
"exports": ["createElementMap"],
|
||
},
|
||
// Public player-state types are consumed by package users outside this
|
||
// workspace. Keep the barrel stable even when no in-repo import needs it.
|
||
{
|
||
"file": "packages/studio/src/player/index.ts",
|
||
"exports": ["ZoomMode"],
|
||
},
|
||
// Part of useTimelineEditing's inferred public return type; consumers invoke
|
||
// handleTimelineGroupResize without importing the change type directly.
|
||
{
|
||
"file": "packages/studio/src/hooks/useTimelineGroupEditing.ts",
|
||
"exports": ["TimelineGroupResizeChange"],
|
||
},
|
||
{
|
||
"file": "packages/studio/src/player/components/timelineGroupEditing.ts",
|
||
"exports": [
|
||
"buildTimelineGroupResizeMembers",
|
||
"resolveTimelineGroupResizeChanges",
|
||
"applyTimelineGroupResizePreview",
|
||
],
|
||
},
|
||
{
|
||
"file": "packages/studio/src/player/components/timelineEditing.ts",
|
||
"exports": [
|
||
"selectTimelineElementsInMarquee",
|
||
"TimelineGroupResizeEdge",
|
||
"TimelineGroupTimingMember",
|
||
],
|
||
},
|
||
{
|
||
"file": "packages/studio/src/player/lib/timelineElementHelpers.ts",
|
||
"exports": ["furthestClipEndFromDocument"],
|
||
},
|
||
{
|
||
"file": "packages/studio/src/components/sidebar/AssetContextMenu.tsx",
|
||
"exports": ["DeleteConfirm"],
|
||
},
|
||
{
|
||
"file": "packages/studio/src/utils/timelineAssetDrop.ts",
|
||
"exports": [
|
||
"setCompositionDurationToContent",
|
||
"extendCompositionDurationIfNeeded",
|
||
"fitTimelineAssetGeometry",
|
||
"resolveTimelineAssetCompositionSize",
|
||
],
|
||
},
|
||
{
|
||
"file": "packages/studio/src/components/sidebar/assetHelpers.ts",
|
||
"exports": ["truncateMiddle", "formatDuration"],
|
||
},
|
||
{
|
||
"file": "packages/studio/src/utils/studioHelpers.ts",
|
||
"exports": ["resolveDroppedAssetDimensions"],
|
||
},
|
||
{
|
||
"file": "packages/core/src/audio/audioFxGraph.ts",
|
||
"exports": ["ensureAudioFxWorklets"],
|
||
},
|
||
// automationLaneGeometry is the bottom of the audio-automation stack: its
|
||
// consumer is the lane component one PR upstack, so a per-PR audit diffing
|
||
// against the merge base sees these as unused. Consumed for real once the
|
||
// stack merges; safe to drop this entry then.
|
||
{
|
||
"file": "packages/studio/src/player/components/automationLaneGeometry.ts",
|
||
"exports": [
|
||
"POINT_MERGE_SEC",
|
||
"GRAB_PX",
|
||
"DRAW_SAMPLES",
|
||
"PAD_X",
|
||
"formatValue",
|
||
"laneFor",
|
||
"withLane",
|
||
],
|
||
},
|
||
// automationShapes is part of the audio-automation stack: its consumer is
|
||
// the UI layer that uses shape generators one PR upstack, so a per-PR audit
|
||
// diffing against the merge base sees these as unused. Consumed for real once
|
||
// the stack merges; safe to drop this entry then.
|
||
{
|
||
"file": "packages/studio/src/player/components/automationShapes.ts",
|
||
"exports": ["AUTOMATION_SHAPES"],
|
||
},
|
||
// automationSimplify is part of the audio-automation stack: its consumer is
|
||
// the UI layer one PR upstack, so a per-PR audit diffing against the merge
|
||
// base sees these as unused. Consumed for real once the stack merges; safe
|
||
// to drop this entry then.
|
||
{
|
||
"file": "packages/studio/src/player/components/automationSimplify.ts",
|
||
"exports": ["simplifyPoints"],
|
||
},
|
||
// propertyPanelAutomation is the shared reader for both panel sections; the
|
||
// FX group that consumes these two lands one PR upstack, so a per-PR audit
|
||
// against the merge base sees them as unused.
|
||
{
|
||
"file": "packages/studio/src/components/editor/propertyPanelAutomation.ts",
|
||
"exports": ["automatedTargetsOf", "resolveAutomationRange"],
|
||
},
|
||
// drawElementService is the bottom of the fast-capture Graphite stack
|
||
// (#1917): its consumers (frameCapture in #1919) land two PRs upstack, so
|
||
// a per-PR audit diffing against the merge base sees these exports as
|
||
// unused. Consumed for real once the stack merges; safe to drop this
|
||
// entry after #1919 lands.
|
||
{
|
||
"file": "packages/engine/src/services/drawElementService.ts",
|
||
"exports": [
|
||
"instrumentAcceleratedCanvases",
|
||
"injectDrawElementCanvas",
|
||
"captureDrawElementFrame",
|
||
"initDrawElementWorkerEncode",
|
||
"cleanupDrawElementWorkerEncode",
|
||
"produceDrawElementFrame",
|
||
],
|
||
},
|
||
// External-conflict persistence is the #2990 stack boundary. The coordinator
|
||
// consumes these exports in child PR #2991; keep the primitive independently reviewable.
|
||
{
|
||
"file": "packages/studio/src/utils/externalConflictStorage.ts",
|
||
"exports": [
|
||
"persistExternalConflictSnapshot",
|
||
"persistExternalFailureSnapshot",
|
||
"loadExternalConflictSnapshot",
|
||
"deleteExternalConflictSnapshot",
|
||
],
|
||
},
|
||
// CLI command files: every command exports a const `examples` per the
|
||
// convention documented in CLAUDE.md. This is a namespace barrel, not a
|
||
// collision.
|
||
{ "file": "packages/cli/src/commands/**/*.ts", "exports": ["examples"] },
|
||
// Options type for the render-queue hook's public startRender callback —
|
||
// consumed structurally by callers (StudioRightPanels), not by import.
|
||
{
|
||
"file": "packages/studio/src/components/renders/useRenderQueue.ts",
|
||
"exports": ["StartRenderOptions"],
|
||
},
|
||
// Independent ML model managers each declare their own DEFAULT_MODEL /
|
||
// MODELS_DIR / ensureModel for their model namespace.
|
||
{
|
||
"file": "packages/cli/src/{background-removal,tts,whisper}/manager.ts",
|
||
"exports": ["DEFAULT_MODEL", "MODELS_DIR", "ensureModel"],
|
||
},
|
||
// `isPathInside` is documented as exported-for-tests only in fileServer.ts;
|
||
// it has different semantics (symlink resolution) from utils/paths.ts.
|
||
{
|
||
"file": "packages/producer/src/services/fileServer.ts",
|
||
"exports": ["isPathInside"],
|
||
},
|
||
// `sampledAlphaIsFullyOpaque` is exported for direct unit testing of the
|
||
// 1/2/3-frame byte-count gate and per-frame stride logic; the pixel-level
|
||
// contract is too load-bearing to only exercise through `webmAlphaAdvisory`.
|
||
{
|
||
"file": "packages/cli/src/utils/webmAlphaCheck.ts",
|
||
"exports": ["sampledAlphaIsFullyOpaque"],
|
||
},
|
||
// Studio telemetry: consumed by useRenderQueue.ts / StudioFeedbackBar.tsx
|
||
// (deep relative imports) but fallow's static analyzer doesn't trace
|
||
// them. Same path-resolution quirk — trackStudioSessionStart from the
|
||
// same file resolves fine.
|
||
{
|
||
"file": "packages/studio/src/telemetry/events.ts",
|
||
"exports": ["trackStudioRenderStart", "trackStudioFeedback"],
|
||
},
|
||
// domEditingLayers: these exports are consumed via the browser iframe
|
||
// runtime context (not traceable by static import analysis from the
|
||
// studio entry point) or re-exported through the domEditing barrel but
|
||
// have no downstream consumers yet.
|
||
{
|
||
"file": "packages/studio/src/components/editor/domEditingLayers.ts",
|
||
"exports": [
|
||
"isEditableTextLeaf",
|
||
"collectDomEditTextFields",
|
||
"buildElementLabel",
|
||
"refreshDomEditSelection",
|
||
],
|
||
},
|
||
// domEditing barrel: re-exports consumed throughout the studio but
|
||
// fallow's static analyzer can't trace re-exports through barrel files.
|
||
{
|
||
"file": "packages/studio/src/components/editor/domEditing.ts",
|
||
"exports": ["*"],
|
||
},
|
||
// Exported for render.test.ts (exported-for-tests pattern).
|
||
{
|
||
"file": "packages/cli/src/commands/render.ts",
|
||
"exports": [
|
||
"resolveBrowserGpuForCli",
|
||
"renderLocal",
|
||
"checkRenderResolutionPreflight",
|
||
"renderLintContinuationHint",
|
||
],
|
||
},
|
||
// initThreeDProjectionInPage: passed to page.evaluate() for browser-side execution —
|
||
// Puppeteer serializes it at runtime, not an import-graph consumer.
|
||
{
|
||
"file": "packages/engine/src/services/threeDProjection.ts",
|
||
"exports": ["initThreeDProjectionInPage"],
|
||
},
|
||
// captureCost.ts: constants and helpers consumed by the runCaptureCalibration
|
||
// orchestration function and tests, but the entry-point graph doesn't
|
||
// reach them because the orchestrator's caller resolves them dynamically.
|
||
{
|
||
"file": "packages/producer/src/services/render/captureCost.ts",
|
||
"exports": [
|
||
"CAPTURE_CALIBRATION_TARGET_MS",
|
||
"MAX_MEASURED_CAPTURE_COST_MULTIPLIER",
|
||
"CAPTURE_CALIBRATION_PROTOCOL_TIMEOUT_MS",
|
||
"measureCaptureCostFromSession",
|
||
"logCaptureCalibrationResult",
|
||
"createFailedCaptureCalibrationEstimate",
|
||
],
|
||
},
|
||
// gsapParserExports.ts is the public-API barrel that re-exports constants,
|
||
// types, and utilities from gsapConstants, gsapSerialize, and springEase.
|
||
// The re-exports are intentional public API consumed by callers outside the
|
||
// changed-file set (e.g. studio, aws-lambda) and therefore appear unused
|
||
// to fallow's static analysis of the PR diff.
|
||
{
|
||
"file": "packages/parsers/src/gsapParserExports.ts",
|
||
"exports": [
|
||
"PROPERTY_GROUPS",
|
||
"classifyPropertyGroup",
|
||
"classifyTweenPropertyGroup",
|
||
"SPRING_PRESETS",
|
||
"generateSpringEaseData",
|
||
"GsapMethod",
|
||
"GsapKeyframesData",
|
||
"GsapKeyframeFormat",
|
||
"PropertyGroupName",
|
||
"SpringPreset",
|
||
],
|
||
},
|
||
// Shared test helpers consumed by gsapParser.test.ts (same file,
|
||
// fallow doesn't trace intra-file test consumption).
|
||
{
|
||
"file": "packages/parsers/src/gsapParser.test-helpers.ts",
|
||
"exports": [
|
||
"expectKeyframe",
|
||
"expectKeyframesFormat",
|
||
"convertAndReparse",
|
||
"parseSplitAndAssert",
|
||
],
|
||
},
|
||
// hfIds: EXCLUDED_TAGS is consumed by tests (htmlParser.test.ts) and
|
||
// hfIdPersist.ts but fallow's static analyzer may not trace all consumers.
|
||
{
|
||
"file": "packages/parsers/src/hfIds.ts",
|
||
"exports": ["EXCLUDED_TAGS", "mintHfId"],
|
||
},
|
||
// Shared timeline components extracted for downstream PRs in the
|
||
// razor-blade stack (#1330, #1331). Consumers live on those branches.
|
||
{
|
||
"file": "packages/studio/src/player/components/timelineCallbacks.ts",
|
||
"exports": ["*"],
|
||
},
|
||
// Shared timeline DOM barrel for downstream consumers; fallow does not
|
||
// trace all re-export-only modules.
|
||
{
|
||
"file": "packages/studio/src/player/lib/timelineDOM.ts",
|
||
"exports": ["*"],
|
||
},
|
||
// Re-exports from useDomEditCommits: barrel-style re-exports
|
||
// consumed by downstream studio code.
|
||
{
|
||
"file": "packages/studio/src/hooks/useDomEditCommits.ts",
|
||
"exports": ["GSAP_CSS_FALLBACK_BLOCKED_MESSAGE", "PersistDomEditOperations"],
|
||
},
|
||
{
|
||
"file": "packages/studio/src/utils/timelineElementSplit.ts",
|
||
"exports": ["buildPatchTarget", "readFileContent"],
|
||
},
|
||
// freezeUrl and freezeLocalFile are public API re-exported from the figma
|
||
// barrel (index.ts) for Task 4 manifest flow and the /figma skill integration;
|
||
// not yet imported by current code outside the module.
|
||
{
|
||
"file": "packages/core/src/figma/freeze.ts",
|
||
"exports": ["freezeUrl", "freezeLocalFile"],
|
||
},
|
||
// mediaDir, typeDirPath, isFigmaManifestRecord: re-exported from the figma
|
||
// barrel (index.ts) via manifest.ts per Task 8 wiring. Consumed only by the
|
||
// /figma skill integration, not by code in the current codebase.
|
||
{
|
||
"file": "packages/core/src/figma/manifest.ts",
|
||
"exports": ["mediaDir", "typeDirPath", "isFigmaManifestRecord"],
|
||
},
|
||
// STUDIO_FLAT_INSPECTOR_ENABLED: exported for use by downstream studio
|
||
// inspector redesign tasks; consumed by components in later PRs.
|
||
{
|
||
"file": "packages/studio/src/components/editor/manualEditingAvailability.ts",
|
||
"exports": ["STUDIO_FLAT_INSPECTOR_ENABLED"],
|
||
},
|
||
// TextAreaField: newly exported for FlatTextSection (flat inspector
|
||
// redesign, Task 8), which lands in a later commit on this branch.
|
||
{
|
||
"file": "packages/studio/src/components/editor/propertyPanelSections.tsx",
|
||
"exports": ["TextAreaField"],
|
||
},
|
||
// Link: its only consumer was FlatRadiusRow's uniform-only fallback row in
|
||
// propertyPanelFlatStyleSections.tsx, deleted by the Style parity fix
|
||
// (p8-task-style-parity) — that row was unreachable from a uniform radius
|
||
// and is now replaced by BorderRadiusEditor's own unlink toggle. Kept in
|
||
// the icon set for future reuse rather than deleted from a file outside
|
||
// this fix's scope.
|
||
{
|
||
"file": "packages/studio/src/icons/SystemIcons.tsx",
|
||
"exports": ["Link"],
|
||
},
|
||
],
|
||
"ignoreDependencies": [
|
||
// Runtime/dynamic deps not visible to static analysis: tsup `external`,
|
||
// dynamic require() resolution, peer/static-file consumption in tests,
|
||
// and bun-hoisted workspace devDeps (e.g. happy-dom in root package.json
|
||
// resolves for every workspace, so workspaces don't redeclare it).
|
||
// Required by @puppeteer/browsers and puppeteer-core at runtime; listed
|
||
// as a direct dep to guarantee installation even when transitive
|
||
// resolution fails (corrupted cache, dedup edge cases).
|
||
"debug",
|
||
// @puppeteer/browsers' optional peer: its zip fallback when no system `unzip` exists.
|
||
"yauzl",
|
||
// Loaded through the optional package loader for Gemini vision captioning.
|
||
"@google/genai",
|
||
"puppeteer",
|
||
"puppeteer-core",
|
||
"esbuild",
|
||
"giget",
|
||
"gsap",
|
||
"happy-dom",
|
||
"ffmpeg-static",
|
||
"ffprobe-static",
|
||
"@hyperframes/core",
|
||
"@hyperframes/studio",
|
||
"@hyperframes/producer",
|
||
// Inspector's published declarations import it through the core sources they bundle.
|
||
"@hyperframes/parsers",
|
||
"@fontsource/archivo-black",
|
||
"@fontsource/eb-garamond",
|
||
"@fontsource/ibm-plex-mono",
|
||
"@fontsource/inter",
|
||
"@fontsource/jetbrains-mono",
|
||
"@fontsource/league-gothic",
|
||
"@fontsource/montserrat",
|
||
"@fontsource/nunito",
|
||
"@fontsource/oswald",
|
||
"@fontsource/outfit",
|
||
"@fontsource/space-mono",
|
||
"@fontsource/lato",
|
||
"@fontsource/noto-sans-jp",
|
||
"@fontsource/open-sans",
|
||
"@fontsource/playfair-display",
|
||
"@fontsource/poppins",
|
||
"@fontsource/roboto",
|
||
"@fontsource/source-code-pro",
|
||
],
|
||
"duplicates": {
|
||
// Raise from the default 5 to 6 lines so trivially short Hono route-handler
|
||
// preambles (resolveProject + 404 + body-parse) are below the threshold.
|
||
// The three 5-line groups in files.ts / render.ts are structural boilerplate
|
||
// that naturally converges and is unlikely to diverge; extraction would
|
||
// require intrusive middleware changes beyond this PR's scope.
|
||
"minLines": 6,
|
||
"ignore": [
|
||
// Pre-existing clone with extractVideosStage.ffmpegTimeout.test.ts: both mock the engine's whole
|
||
// ExtractionResult. Touching the mock to record another option re-flags it.
|
||
"packages/producer/src/services/render/stages/extractVideosStage.timelineBound.test.ts",
|
||
// AWS Lambda and GCP Cloud Run deliberately mirror the same distributed
|
||
// rendering lifecycle while retaining provider-specific SDK, storage, and
|
||
// retry semantics. The Plan v2 AWS adapter extends that existing symmetry;
|
||
// extracting a shared cloud abstraction would couple independent packages.
|
||
"packages/aws-lambda/src/handler.ts",
|
||
"packages/cli/src/registry/motionBlurShutter.browser.test.ts",
|
||
"packages/aws-lambda/src/s3Transport.ts",
|
||
// The GCP handler deliberately mirrors the AWS protocol lifecycle while
|
||
// retaining provider-specific GCS, HTTP, and Cloud Workflows semantics.
|
||
// Its tests also mirror the same wire-contract cases; a cross-provider
|
||
// test abstraction would hide the adapter boundary being asserted.
|
||
"packages/gcp-cloud-run/src/server.ts",
|
||
"packages/gcp-cloud-run/src/server.test.ts",
|
||
// sourcePatcher.ts: pre-existing internal clones between the inline-style
|
||
// and attribute tag-patchers; only the PatchOperation type gained two
|
||
// optional fields here, but the line shift makes fallow re-flag them.
|
||
"packages/studio/src/utils/sourcePatcher.ts",
|
||
// useGsapSelectionHandlers.ts: pre-existing parallel structure with
|
||
// useDomEditWiring.ts (thin useCallback wrappers guarding on selection);
|
||
// only gained two optional pass-through parameters here, but the line
|
||
// shift makes fallow re-flag the pre-existing clone.
|
||
"packages/studio/src/hooks/useGsapSelectionHandlers.ts",
|
||
// gsapParser.ts: recast/babel GSAP writer — intentional duplication between
|
||
// recast and acorn parallel implementations (pre-existing, moved from core).
|
||
"packages/parsers/src/gsapParser.ts",
|
||
// hfIds.ts: 7-line clone with sdk/engine/mutate.ts — pre-existing duplication
|
||
// from when hfIds lived in packages/core/src/parsers/. Moving the file to the
|
||
// new package makes fallow see it as a fresh finding; the underlying clone
|
||
// predates this refactor.
|
||
"packages/parsers/src/hfIds.ts",
|
||
// Font pipeline: pre-existing duplication moved from packages/producer/src/services/
|
||
// and producer/scripts/ to core/src/fonts/ and core/scripts/ (the generator mirrors
|
||
// CANONICAL_FONTS; the tests share arrange/act scaffolds).
|
||
"packages/core/scripts/generate-font-data.ts",
|
||
"packages/core/src/fonts/deterministicFonts-aliasSupplement.test.ts",
|
||
"packages/core/src/fonts/deterministicFonts-authoredResources.test.ts",
|
||
"packages/core/src/fonts/deterministicFonts-failClosed.test.ts",
|
||
"packages/core/src/fonts/deterministicFonts-googleSubsets.test.ts",
|
||
"packages/core/src/fonts/deterministicFonts-retries.test.ts",
|
||
"packages/core/src/fonts/fontCompression.test.ts",
|
||
// Parser test files: parallel arrange/act/assert test cases — pre-existing
|
||
// duplication moved from packages/core/src/parsers/.
|
||
"packages/parsers/src/gsapParser.test.ts",
|
||
"packages/parsers/src/gsapParser.test-helpers.ts",
|
||
"packages/parsers/src/gsapWriter.parity.test.ts",
|
||
"packages/parsers/src/gsapWriterParity.corpus.test.ts",
|
||
"packages/parsers/src/gsapWriterParity.acorn.test.ts",
|
||
"packages/parsers/src/htmlParser.roundtrip.test.ts",
|
||
"packages/parsers/src/htmlParser.test.ts",
|
||
// @hyperframes/studio-server test files: parallel arrange/act/assert test cases
|
||
// (pre-existing structure from when studio-api lived in packages/core/src/studio-api/).
|
||
"packages/studio-server/src/routes/files.test.ts",
|
||
"packages/studio-server/src/routes/render.test.ts",
|
||
"packages/studio-server/src/routes/lint.test.ts",
|
||
// Studio gesture tests: pre-existing parallel overlay-option setups and arrange/assert blocks.
|
||
"packages/studio/src/components/editor/domEditOverlayStartGesture.test.ts",
|
||
"packages/studio/src/components/editor/anchoredResizeCommitFeedsOffset.test.ts",
|
||
"packages/studio/src/components/editor/rotateInlineSave.test.ts",
|
||
// Waiting-press and drag tests: each case spells out its own press, reload and release; a shared
|
||
// helper would hide the sequence each one asserts.
|
||
"packages/studio/src/components/editor/domEditOverlayStartGesture.blocked.test.ts",
|
||
"packages/studio/src/components/editor/dragUndoPaint.test.ts",
|
||
"packages/studio/src/components/editor/manualOffsetDrag.test.ts",
|
||
"packages/studio/src/components/editor/gestureHoldsPreviewReload.test.tsx",
|
||
// Preview reload tests: each case spells out its own mount, reload and swap sequence.
|
||
"packages/studio/src/player/hooks/useTimelinePlayer.shadowReload.test.ts",
|
||
"packages/studio/src/components/nle/NLEContext.test.ts",
|
||
"packages/studio/src/hooks/useDomGeometryCommits.test.tsx",
|
||
// extractionCache.test.ts: pre-existing parallel describe setup and publish-case arrange/assert blocks.
|
||
"packages/engine/src/services/extractionCache.test.ts",
|
||
"packages/studio-server/src/routes/preview.test.ts",
|
||
"packages/studio-server/src/routes/projects.test.ts",
|
||
"packages/studio-server/src/helpers/applyFileMutations.test.ts",
|
||
"packages/studio-server/src/helpers/backupJournal.test.ts",
|
||
"packages/studio-server/src/helpers/finiteMutation.test.ts",
|
||
"packages/studio-server/src/helpers/hfIdPersist.test.ts",
|
||
"packages/studio-server/src/helpers/manualEditsRenderScript.test.ts",
|
||
"packages/studio-server/src/helpers/mediaValidation.test.ts",
|
||
"packages/studio-server/src/helpers/previewAdapter.test.ts",
|
||
"packages/studio-server/src/helpers/safePath.test.ts",
|
||
"packages/studio-server/src/helpers/sourceMutation.test.ts",
|
||
"packages/studio-server/src/helpers/studioMotionRenderScript.test.ts",
|
||
"packages/studio-server/src/helpers/subComposition.test.ts",
|
||
// @hyperframes/lint rule test files: parallel arrange/act/assert test cases
|
||
// (pre-existing structure from when lint lived in packages/core/src/lint/).
|
||
"packages/lint/src/rules/adapters.test.ts",
|
||
"packages/lint/src/rules/captions.test.ts",
|
||
"packages/lint/src/rules/composition.test.ts",
|
||
"packages/lint/src/rules/core.test.ts",
|
||
"packages/lint/src/rules/fonts.test.ts",
|
||
"packages/lint/src/rules/gsap.test.ts",
|
||
"packages/lint/src/rules/media.test.ts",
|
||
"packages/lint/src/rules/slideshow.test.ts",
|
||
"packages/lint/src/rules/textures.test.ts",
|
||
"packages/lint/src/hyperframeLinter.test.ts",
|
||
// slideshowPanelHelpers.ts: setSlideNotes/addFragment/addHotspot share an
|
||
// intentional parallel shape (signature + mapSlidesIn → exists-check →
|
||
// map/append); the per-slide mutation differs, so a shared abstraction
|
||
// would obscure more than it dedupes.
|
||
"packages/studio/src/components/panels/slideshowPanelHelpers.ts",
|
||
// SlideshowPanel.test.ts: parallel arrange/act/assert test cases — collapsing
|
||
// them would hurt readability of what each case verifies.
|
||
"packages/studio/src/components/panels/SlideshowPanel.test.ts",
|
||
// hyperframes-player.test.ts: parallel arrange/act/assert test cases verifying
|
||
// distinct behaviors (same-origin vs realm media, audio-locked permutations,
|
||
// seek bridge variants). Each case is self-contained for readability;
|
||
// extracting the iframe / mock-audio setup helpers would over-couple
|
||
// unrelated scenarios under a shared fixture.
|
||
"packages/player/src/hyperframes-player.test.ts",
|
||
// present.ts mirrors play.ts's server startup + console-output block. The
|
||
// shared low-level pieces (resolve*/injectRuntime/listenOnFreePort) are in
|
||
// utils/compositionServer.ts; the remaining clone is per-command logging text
|
||
// (different labels/help lines) — extracting it would over-abstract.
|
||
"packages/cli/src/commands/present.ts",
|
||
// Portrait --resolution alias fix (via/resolution-portrait-fix):
|
||
// cloudrun.ts and lambda.ts are intentionally symmetric per-adapter
|
||
// dispatchers — same subcommand surface (deploy / render / render-batch /
|
||
// progress / destroy), same argument parsers (parseFormat / parseCodec /
|
||
// parseQuality / parsePositiveInt), same wire-config shape. The 390-line
|
||
// cross-file clone is that pre-existing structural symmetry; the shared
|
||
// resolution-flag parse now lives in utils/parseOutputResolution.ts, but
|
||
// consolidating the per-adapter dispatcher body further would collapse
|
||
// two distinct SDK surfaces (AWS + GCP) into a single verb router that
|
||
// future adapters (Azure, etc.) would have to fork back out of.
|
||
// Line-shift fingerprint after adding `outputResolutionAspectAgnostic`
|
||
// threading re-flags the inherited clones.
|
||
"packages/cli/src/commands/cloudrun.ts",
|
||
"packages/cli/src/commands/lambda.ts",
|
||
// lambda/render.ts and lambda/render-batch.ts declare parallel
|
||
// RenderArgs / RenderBatchArgs interfaces (same core render knobs, with
|
||
// batch-only extras like maxConcurrent / dryRun). Extracting the shared
|
||
// subset into a base interface would force every consumer to spell out
|
||
// the intersection at every call site; the current shape is
|
||
// intent-preserving. Pre-existing dupe, re-flagged after threading the
|
||
// aspect-agnostic field through both interfaces.
|
||
"packages/cli/src/commands/lambda/render.ts",
|
||
"packages/cli/src/commands/lambda/render-batch.ts",
|
||
// skillsManifest.test.ts: parallel arrange/act/assert cases for locateInstall
|
||
// (project vs global scope, per-agent host conventions, claude-code priority).
|
||
// Each case seeds a dir then asserts the resolved location/agent; collapsing
|
||
// the shared seed/assert shape would obscure what each scope/host verifies.
|
||
"packages/cli/src/utils/skillsManifest.test.ts",
|
||
// skills.test.ts: parallel prune cases (removed-in-global vs project, non-slug
|
||
// rejection, --source/--dir plumbing) share a mock-checkSkills → runSkillsUpdate
|
||
// → assert-remove-spawn shape; each verifies a distinct prune behavior, so
|
||
// extracting the shared scaffold would obscure what each case asserts.
|
||
"packages/cli/src/commands/skills.test.ts",
|
||
// figma test files: freeze.test.ts and manifest.test.ts share a common
|
||
// arrange/act/assert setup preamble (file creation + test dir handling) that
|
||
// is minimal boilerplate; collapsing it into a shared fixture would reduce
|
||
// readability of each test's independent setup.
|
||
"packages/core/src/figma/freeze.test.ts",
|
||
"packages/core/src/figma/manifest.test.ts",
|
||
// layout-audit.browser.test.ts: parallel arrange/act/assert cases per audit
|
||
// rule (overflow / overlap / occlusion) that each install their own mocked
|
||
// geometry + computed-style before asserting. The clone groups are this
|
||
// pre-existing per-rule scaffold; adding a clip-path case shifts lines and
|
||
// re-flags it. Collapsing the per-rule installers would obscure each case.
|
||
"packages/cli/src/commands/layout-audit.browser.test.ts",
|
||
// portUtils.ts contains two pre-existing bounded HTTP probe implementations;
|
||
// this PR only teaches the server scan to prefer its reported PID, but that
|
||
// line shift makes fallow re-flag the inherited probe clones.
|
||
"packages/cli/src/server/portUtils.ts",
|
||
// iframe.test.ts: the remaining clone groups are pre-existing per-case arrange
|
||
// blocks in the selection and draft-loop suites (build an adapter, wire a spy,
|
||
// act). Appending the paint-query suite shifts their line numbers and re-flags
|
||
// them; each block states its own setup on purpose, which a shared fixture
|
||
// would hide.
|
||
"packages/sdk/src/adapters/iframe.test.ts",
|
||
// gsapParserAcorn.motionEval.test.ts: parallel arrange/act/assert cases for
|
||
// the staggered-collection honesty pass (.from reveal vs .to landing on the
|
||
// rest pose). Each asserts a distinct keyframe shape; collapsing the shared
|
||
// parse/keyframes-extraction scaffold would obscure what each case verifies.
|
||
"packages/core/src/parsers/gsapParserAcorn.motionEval.test.ts",
|
||
// Studio UX-review sweep (148 findings fixed across ~90 studio files):
|
||
// heavily-edited files re-flag line-shifted inherited complexity, and the
|
||
// new small handlers (a11y keydown/menu/dialog/error-state paths, mostly
|
||
// 5-6 cyclomatic) trip the CRAP threshold absent coverage data. Reviewed
|
||
// individually in the studio-ux PR stack rather than refactored here.
|
||
"packages/studio/src/player/components/TimelineClipDiamonds.test.tsx",
|
||
"packages/studio/src/hooks/useFileManager.ts",
|
||
"packages/studio/src/captions/hooks/useCaptionSync.ts",
|
||
"packages/studio/vite.adapter.ts",
|
||
"packages/studio/src/components/sidebar/AudioRow.tsx",
|
||
"packages/studio/src/components/sidebar/AssetsTab.tsx",
|
||
"packages/studio/src/components/editor/propertyPanelFill.tsx",
|
||
"packages/studio/src/captions/store.ts",
|
||
"packages/studio/src/captions/components/CaptionOverlay.tsx",
|
||
"packages/cli/src/server/studioServer.ts",
|
||
// Sub-composition html/body scoping fix: inlineSubCompositions.ts has a
|
||
// pre-existing head-vs-content script-extraction clone, and the scoping
|
||
// test file has pre-existing parallel arrange/act/assert cases. Adding the
|
||
// scopeRootSelectors handling shifts lines and re-flags both.
|
||
"packages/core/src/compiler/inlineSubCompositions.ts",
|
||
"packages/core/src/compiler/compositionScoping.test.ts",
|
||
// useCanvasZOrderTimelineMirror.test.tsx: independent gesture cases repeat
|
||
// the minimal hook/store harness so rapid and rejected z writes cannot
|
||
// leak state through a shared fixture.
|
||
"packages/studio/src/components/nle/useCanvasZOrderTimelineMirror.test.tsx",
|
||
// timelineTimingSync.test.ts: ownership, rollback, transport, and preview
|
||
// convergence cases deliberately keep their server stubs and assertions
|
||
// local; extracting the repeated arrange/act/assert shape would couple
|
||
// otherwise independent failure-domain regressions.
|
||
"packages/studio/src/hooks/timelineTimingSync.test.ts",
|
||
// useElementLifecycleOps.test.tsx: the reveal and atomic multi-file cases
|
||
// repeat a small render/persist harness to keep each transaction's setup,
|
||
// durable outcome, and rollback assertions visible together.
|
||
"packages/studio/src/hooks/useElementLifecycleOps.test.tsx",
|
||
// timelineClipDragCommit.test.ts: drag permutations are self-contained
|
||
// arrange/act/assert scenarios; the repeated clip/file fixture makes each
|
||
// lane and timing outcome readable without shared mutable setup.
|
||
"packages/studio/src/player/components/timelineClipDragCommit.test.ts",
|
||
// timelineZMirror.test.ts: mirror acceptance/refusal cases repeat their
|
||
// compact lane fixture so each z-to-lane decision remains independently
|
||
// understandable and cannot inherit state from another case.
|
||
"packages/studio/src/player/components/timelineZMirror.test.ts",
|
||
// gsapUndoRestore.test.ts: soft/full restore cases keep the serialized and
|
||
// live DOM snapshots beside their assertions; sharing those short fixtures
|
||
// would obscure the exact script/identity difference under test.
|
||
"packages/studio/src/utils/gsapUndoRestore.test.ts",
|
||
// Studio flat-inspector redesign (Plans 2-4): each Flat*Section test file
|
||
// repeats the same renderInto/pointerdown-drag/reset-click scaffold as its
|
||
// sibling group's tests, added task-by-task across separate PRs on this
|
||
// branch. Pre-existing relative to Grade group (Plan 5) work; consistent
|
||
// with the norm above of leaving parallel arrange/act/assert test cases
|
||
// unabstracted where each case verifies a distinct control's behavior.
|
||
"packages/studio/src/components/editor/propertyPanelFlatMediaSection.test.tsx",
|
||
"packages/studio/src/components/editor/propertyPanelFlatMediaSection.tsx",
|
||
"packages/studio/src/components/editor/propertyPanelMediaSection.tsx",
|
||
"packages/studio/src/components/editor/PropertyPanel.test.tsx",
|
||
"packages/studio/src/components/editor/propertyPanelFlatStyleSections.test.tsx",
|
||
"packages/studio/src/components/editor/propertyPanelFlatMotionSection.test.tsx",
|
||
// Thumbnail id-escape fix (via/thumbnail-id-escape): getElementScreenshotClip's
|
||
// matches/rect/pad clip-computation body has a pre-existing 19-line clone with
|
||
// the inline `page.evaluate` block in vite.browser.ts (the dev-server thumbnail
|
||
// path). Adding a try/catch guard around the querySelectorAll call shifts the
|
||
// clone's line numbers, re-flagging the inherited duplication. Extracting the
|
||
// shared body into a common helper would require the browser-side page.evaluate
|
||
// to import from a Node-side module, which puppeteer's serialization boundary
|
||
// makes non-trivial.
|
||
"packages/studio-server/src/helpers/screenshotClip.ts",
|
||
"packages/studio/vite.browser.ts",
|
||
// off_pivot_rotation Kåsa circle fit (feat/needle-pivot-offset-check):
|
||
// fitCirclePoints in layout-audit.browser.js and fitCircle in
|
||
// checkPipeline.ts are the same least-squares circle fit, but the browser
|
||
// copy is injected as a raw string via page.addScriptTag and cannot import
|
||
// the Node-side module across puppeteer's serialization boundary. The two
|
||
// copies carry matching "KEEP IN SYNC" headers; the duplication is
|
||
// intentional and per-language, so it's exempted here rather than faked
|
||
// away with cosmetic divergence.
|
||
"packages/cli/src/commands/layout-audit.browser.js",
|
||
"packages/cli/src/utils/checkPipeline.ts",
|
||
// check.test.ts: the fakeDriver-based command tests share a pre-existing
|
||
// arrange/act/assert scaffold (runScenario + vi.fn runPipeline + spy +
|
||
// createCheckCommand). Adding the required collectOffPivotRotationSample
|
||
// stub to the CheckAuditDriver fake shifts line numbers and re-flags that
|
||
// inherited clone; consistent with the norm above of leaving parallel
|
||
// command-test cases unabstracted.
|
||
"packages/cli/src/commands/check.test.ts",
|
||
// canary.test.ts: rawFnv is a deliberate independent re-implementation of
|
||
// canary.ts's fnv1a32, not copy-paste — its own docstring explains why:
|
||
// the test re-derives the hash so it can cross-check canaryBucket against
|
||
// a copy that owes it nothing, rather than importing the function under
|
||
// test. Importing fnv1a32 here would defeat the point of the assertion.
|
||
"packages/core/src/canary.test.ts",
|
||
// The audio FX property-panel test files (and the two siblings outside
|
||
// this stack, propertyPanelFlatMotionSection.test.tsx and
|
||
// propertyPanelFlatEffectsSection.test.tsx) share a `renderInto` React
|
||
// mount helper — pre-existing across nine files, not introduced here.
|
||
// The FxSection/FlatTextSection `mount()` wrappers additionally look
|
||
// alike because both build a props-with-overrides harness for their own
|
||
// component; the prop shapes differ per component, so a shared mount
|
||
// abstraction would obscure more than it dedupes (same rationale as
|
||
// slideshowPanelHelpers.ts above).
|
||
"packages/studio/src/components/editor/PropertyPanelEmptyState.test.tsx",
|
||
"packages/studio/src/components/editor/propertyPanelFlatColorGradingSection.test.tsx",
|
||
"packages/studio/src/components/editor/propertyPanelFlatLayoutSection.test.tsx",
|
||
"packages/studio/src/components/editor/propertyPanelFlatPrimitives.test.tsx",
|
||
"packages/studio/src/components/editor/propertyPanelFlatTextSection.test.tsx",
|
||
"packages/studio/src/components/editor/propertyPanelFlatToggle.test.tsx",
|
||
"packages/studio/src/components/editor/propertyPanelFxSection.test.tsx",
|
||
// Inspector browser contracts intentionally repeat setup at the script
|
||
// boundary, while htmlBundler keeps parallel module/classic-script paths.
|
||
"packages/inspector/tests/browser.ts",
|
||
"packages/inspector/tests/film.ts",
|
||
"packages/inspector/tests/timeline.ts",
|
||
"packages/inspector/tests/timelineCompositions.ts",
|
||
"packages/core/src/compiler/htmlBundler.ts",
|
||
],
|
||
},
|
||
"health": {
|
||
// useGsapTweenCache.ts: pre-existing large React-effect hooks (the populate
|
||
// and runtime-scan effects, the per-element animations memo) whose
|
||
// complexity pre-dates the computed-timeline work. Exempted at file level
|
||
// rather than refactored as scope creep.
|
||
"ignore": [
|
||
// generate-font-data.ts: the build-time font data generator moved from producer/scripts;
|
||
// its CRAP score is coverage-driven (a build script no unit test runs).
|
||
"packages/core/scripts/generate-font-data.ts",
|
||
// audio-fx-runtime-entry.ts: the browser-side IIFE entry for the offline FX
|
||
// render. It runs only inside the headless page the engine drives, so unit
|
||
// coverage cannot reach it and its CRAP score is coverage-driven rather
|
||
// than complexity-driven (5 cyclomatic). Its behaviour is covered by the
|
||
// engine's real-browser render tests.
|
||
"packages/core/stubs/audio-fx-runtime-entry.ts",
|
||
// useGestureRecording.ts: readBasePosition/connectGsapRuntime/tick are
|
||
// inherited gesture-runtime control flow. This stack only changes
|
||
// recordSample to coalesce display-rate events onto authored frames;
|
||
// the import and helper insertion shift the untouched functions' lines.
|
||
"packages/studio/src/hooks/useGestureRecording.ts",
|
||
// sourcePatcher.ts: resolveSourceFile / splitInlineStyleDeclarations /
|
||
// patch*InTag pre-date this PR; only the PatchOperation type gained two
|
||
// optional fields, but the line-shift fingerprint re-flags the inherited
|
||
// complexity.
|
||
"packages/studio/src/utils/sourcePatcher.ts",
|
||
// runtime/media.ts: refreshRuntimeMediaCache pre-dates this work and is
|
||
// untouched by it — this stack only adds a volume-lane branch to
|
||
// syncRuntimeMedia's author-volume resolution, but touching the file makes
|
||
// fallow report the inherited function.
|
||
"packages/core/src/runtime/media.ts",
|
||
// timeline.ts: collectRuntimeTimelinePayload (CRITICAL) pre-dates this PR;
|
||
// only an import line changed here (slideshow/sceneId → slideshow/index),
|
||
// but the line-shift fingerprint makes fallow re-flag inherited complexity.
|
||
"packages/core/src/runtime/timeline.ts",
|
||
// sceneId.ts: trivial 5-cyclomatic guard, moved verbatim from
|
||
// packages/core/src/slideshow/ into parsers; flagged only because the move
|
||
// makes fallow treat it as a fresh finding.
|
||
"packages/parsers/src/slideshow/sceneId.ts",
|
||
// assetPaths.ts / rewriteSubCompPaths.ts: pure URL/asset-path helpers moved
|
||
// verbatim from packages/core/src/compiler/ into parsers. The move makes
|
||
// fallow score them as fresh (high CRAP = inherited complexity with no
|
||
// coverage mapping yet); the logic is unchanged.
|
||
"packages/parsers/src/assetPaths.ts",
|
||
"packages/parsers/src/rewriteSubCompPaths.ts",
|
||
// gsapParser.ts: the recast/babel GSAP writer is a 2500-line legacy parser;
|
||
// moved from packages/core/src/parsers/ — same complexity rationale.
|
||
"packages/parsers/src/gsapParser.ts",
|
||
// htmlParser.ts has pre-existing complexity (moved from packages/core).
|
||
"packages/parsers/src/htmlParser.ts",
|
||
// automationSimplify.ts: Ramer–Douglas–Peucker algorithm inherently requires
|
||
// nested loops and stack-based control flow (12 cyclomatic / 20 cognitive);
|
||
// this complexity is by design and not refactorable. Consumed by the UI
|
||
// layer one PR upstack in the audio-automation feature stack.
|
||
"packages/studio/src/player/components/automationSimplify.ts",
|
||
// studio-server files: pre-existing complexity (moved from packages/core/src/studio-api/).
|
||
// files.ts: executeGsapMutationRecast/Acorn are CRITICAL; excluded as files.ts
|
||
// was already in health.ignore at the old path (packages/core/src/studio-api/routes/files.ts).
|
||
"packages/studio-server/src/routes/files.ts",
|
||
"packages/studio-server/src/routes/render.ts",
|
||
"packages/studio-server/src/routes/thumbnail.ts",
|
||
"packages/studio-server/src/helpers/manualEditsRenderScript.ts",
|
||
"packages/studio-server/src/helpers/studioMotionRenderScript.ts",
|
||
"packages/studio-server/src/helpers/subComposition.ts",
|
||
// lint rule implementations and project linter: pre-existing complexity
|
||
// (moved from packages/core/src/lint/). File-level exemption avoids the
|
||
// line-shift fingerprint problem for inherited findings.
|
||
"packages/lint/src/rules/media.ts",
|
||
"packages/lint/src/rules/textures.ts",
|
||
"packages/lint/src/rules/gsap.ts",
|
||
"packages/lint/src/project.ts",
|
||
// SlideshowPanel.tsx: top-level editor panel that wires several independent
|
||
// sections (slides/inspector/branches/hotspot). Its cyclomatic count comes
|
||
// from that fan-out; splitting it would scatter shared state without
|
||
// reducing real complexity. File-level exemption (not an inline comment)
|
||
// avoids the line-shift fingerprint problem noted above.
|
||
"packages/studio/src/components/panels/SlideshowPanel.tsx",
|
||
// play.ts / present.ts: CLI command entrypoints whose cyclomatic count is
|
||
// browser/arg validation + server wiring (same shape as preview.ts). The
|
||
// serving logic is factored into utils/compositionServer.ts; the remaining
|
||
// body is linear validation that reads clearly inline.
|
||
"packages/cli/src/commands/play.ts",
|
||
"packages/cli/src/commands/present.ts",
|
||
// sync-agent-dirs.ts: a build-time codegen that regex-parses upstream
|
||
// agents.ts. parseAgents/resolveGlobalExpr are branchy by nature (literal
|
||
// vs base-var args, validation throws) but small and well-tested via the
|
||
// generated table's shape test; this is dev tooling, not shipped runtime.
|
||
"packages/cli/scripts/sync-agent-dirs.ts",
|
||
// Files modified only for import-path updates (one-line changes to switch
|
||
// from @hyperframes/core/* subpaths to the new packages). Their complexity
|
||
// is pre-existing; the line-shift fingerprint problem makes fallow treat
|
||
// the violations as new even though no logic changed.
|
||
"packages/cli/src/server/studioServer.ts",
|
||
// findPortAndServe's existing port-selection flow predates this PR. The
|
||
// preview-lifecycle change only adds PID metadata to the config response,
|
||
// which shifts the inherited complexity fingerprint in portUtils.ts.
|
||
"packages/cli/src/server/portUtils.ts",
|
||
"packages/core/src/core.types.ts",
|
||
"packages/core/src/generators/hyperframes.ts",
|
||
"packages/producer/src/services/htmlCompiler.ts",
|
||
"packages/studio/src/hooks/gsapRuntimeBridge.ts",
|
||
"packages/studio/src/hooks/gsapShared.ts",
|
||
"packages/studio/src/hooks/gsapDragPositionCommit.ts",
|
||
"packages/studio/src/hooks/gsapKeyframeCacheHelpers.ts",
|
||
"packages/studio/vite.config.ts",
|
||
"packages/cli/src/commands/lint.ts",
|
||
"packages/cli/src/commands/preview.ts",
|
||
"packages/cli/src/commands/publish.ts",
|
||
"packages/cli/src/server/studioServer.ts",
|
||
// set-version.ts: compareSemver helper has pre-existing complexity from
|
||
// semver string parsing logic; line-shift fingerprint problem from new
|
||
// packages added to PACKAGES array makes fallow treat it as new.
|
||
"scripts/set-version.ts",
|
||
// gsapRuntimeReaders.ts: pre-existing complexity in readAllAnimatedProperties;
|
||
// line-shift fingerprint from import-path updates triggers the violation.
|
||
"packages/studio/src/hooks/gsapRuntimeReaders.ts",
|
||
// In-page audit scripts: single large browser-side IIFE wrappers
|
||
// (auditLayout/__contrastAudit) with pre-existing CRITICAL helpers
|
||
// (textOverflowFixHint, selectorFor, the WCAG walk). Adding the small
|
||
// clip-path probe helpers shifts every function below it, so the line-shift
|
||
// fingerprint re-flags inherited complexity even though the new helpers are
|
||
// all at the lowest tier (<=5 cyclomatic).
|
||
"packages/cli/src/commands/layout-audit.browser.js",
|
||
"packages/cli/src/commands/contrast-audit.browser.js",
|
||
// lottie.ts: the flagged `seek` handler (lottie-web/dotLottie dual-API
|
||
// dispatch, unchanged by the duration-auto-inference work in this PR)
|
||
// pre-dates this PR's scope. New functions added earlier in the file
|
||
// (getInferredDurationSeconds + helpers) shifted its line numbers,
|
||
// breaking fallow's inherited-detection fingerprint. File-level
|
||
// exemption avoids the line-shift problem for this inherited finding.
|
||
"packages/core/src/runtime/adapters/lottie.ts",
|
||
// info.ts: the flagged `run` command handler pre-dates the keyframes-cli
|
||
// PR; that PR only added the orientation()/durationFromHtml() helpers and
|
||
// swapped a few `maxEnd` reads for the new `duration` variable, without
|
||
// adding branches. The line-shift fingerprint re-flags the inherited
|
||
// complexity even though the logic is unchanged.
|
||
"packages/cli/src/commands/info.ts",
|
||
// gsapParserAcorn.ts: the flagged `sameMemberAccess` (structural equality
|
||
// of two member-access nodes) pre-dates this PR's motion-eval work
|
||
// (added in #1760, unchanged since). The new const-folding / set-seeding /
|
||
// label-position code added earlier in the file shifted its line number,
|
||
// so the line-shift fingerprint re-flags this inherited finding.
|
||
"packages/parsers/src/gsapParserAcorn.ts",
|
||
// isFigmaManifestRecord: type guard with 19 cyclomatic due to chained
|
||
// field validation (id/type/path/source types + value shape guards).
|
||
// This is the correct shape for a discriminating type guard; refactoring
|
||
// into smaller guards would obscure the unified validation contract.
|
||
"packages/core/src/figma/manifest.ts",
|
||
// Studio UX-review sweep (148 findings fixed across ~90 studio files):
|
||
// heavily-edited files re-flag line-shifted inherited complexity, and the
|
||
// new small handlers (a11y keydown/menu/dialog/error-state paths, mostly
|
||
// 5-6 cyclomatic) trip the CRAP threshold absent coverage data. Reviewed
|
||
// individually in the studio-ux PR stack rather than refactored here.
|
||
"packages/studio/src/App.tsx",
|
||
"packages/studio/src/captions/components/CaptionAnimationPanel.tsx",
|
||
"packages/studio/src/captions/components/CaptionOverlay.tsx",
|
||
"packages/studio/src/captions/components/CaptionOverlayUtils.ts",
|
||
"packages/studio/src/captions/components/CaptionPropertyPanel.tsx",
|
||
"packages/studio/src/captions/components/shared.tsx",
|
||
"packages/studio/src/captions/hooks/useCaptionSync.ts",
|
||
"packages/studio/src/components/AskAgentModal.tsx",
|
||
"packages/studio/src/components/editor/BlockParamsPanel.tsx",
|
||
"packages/studio/src/components/editor/DomEditOverlay.tsx",
|
||
"packages/studio/src/components/editor/FileTree.tsx",
|
||
// ColorGradingControls: main's 374-line render function (LUT + vignette/grain
|
||
// detail panels), reconciled against this PR's LUT import spinner/error graft
|
||
// during rebase. Pre-existing complexity; line-shift re-flags it.
|
||
"packages/studio/src/components/editor/propertyPanelColorGradingControls.tsx",
|
||
"packages/studio/src/components/editor/FileTreeNodes.tsx",
|
||
"packages/studio/src/components/editor/LayersPanel.tsx",
|
||
"packages/studio/src/components/editor/MotionPathNode.tsx",
|
||
"packages/studio/src/components/editor/PropertyPanel.tsx",
|
||
"packages/studio/src/components/editor/propertyPanelFont.tsx",
|
||
"packages/studio/src/components/editor/propertyPanelMediaSection.tsx",
|
||
"packages/studio/src/components/editor/propertyPanelStyleSections.tsx",
|
||
"packages/studio/src/components/editor/Transform3DCube.tsx",
|
||
"packages/studio/src/components/LintModal.tsx",
|
||
"packages/studio/src/components/MediaPreview.tsx",
|
||
"packages/studio/src/components/nle/NLEPreview.tsx",
|
||
"packages/studio/src/components/sidebar/AudioRow.tsx",
|
||
"packages/studio/src/components/sidebar/BlocksTab.tsx",
|
||
"packages/studio/src/components/sidebar/CompositionsTab.tsx",
|
||
"packages/studio/src/components/StudioRightPanels.tsx",
|
||
"packages/studio/src/components/StudioToast.tsx",
|
||
"packages/studio/src/components/ui/Tooltip.tsx",
|
||
"packages/studio/src/components/ui/useDialogBehavior.ts",
|
||
"packages/studio/src/hooks/useAppHotkeys.ts",
|
||
// dispatchModifierKey/dispatchPlainKey moved verbatim out of the
|
||
// already-suppressed useAppHotkeys.ts above, to keep that file under
|
||
// the 600-line cap. Same pre-existing complexity, new file path.
|
||
"packages/studio/src/hooks/appHotkeysDispatch.ts",
|
||
"packages/studio/src/hooks/useCaptionDetection.ts",
|
||
"packages/studio/src/hooks/useFileManager.ts",
|
||
"packages/studio/src/hooks/useFrameCapture.ts",
|
||
"packages/studio/src/hooks/usePanelLayout.ts",
|
||
"packages/studio/src/player/components/menuKeyboardNav.ts",
|
||
"packages/studio/src/player/components/Timeline.tsx",
|
||
"packages/studio/src/player/components/TimelineCanvas.tsx",
|
||
"packages/studio/src/player/components/TimelineClip.tsx",
|
||
"packages/studio/src/player/components/TimelineClipDiamonds.tsx",
|
||
// Sub-composition html/body scoping fix: these files carry pre-existing
|
||
// CRITICAL/HIGH functions (inlineSubCompositions, bundleToSingleHtml,
|
||
// mountCompositionContent/loadCompositions, scopeSelector/
|
||
// replaceAuthoredRootIdSelectors) that pre-date this PR. The change only
|
||
// threads a scopeRootSelectors option through the existing scoping calls;
|
||
// the line-shift fingerprint re-flags the inherited complexity.
|
||
"packages/core/src/compiler/compositionScoping.ts",
|
||
"packages/core/src/compiler/inlineSubCompositions.ts",
|
||
"packages/core/src/compiler/htmlBundler.ts",
|
||
"packages/core/src/runtime/compositionLoader.ts",
|
||
// TextFieldEditor: pre-existing complexity from earlier Text-inspector
|
||
// work on this same branch (commits 444639d75, b57b31beb, 6f2e9848c,
|
||
// eba8a0fa2), unrelated to the Grade group (Plan 5) currently landing.
|
||
"packages/studio/src/components/editor/propertyPanelSections.tsx",
|
||
// Portrait --resolution alias fix (via/resolution-portrait-fix):
|
||
// server.ts `render` (cyclo 10 / CRAP 31.6) and distributed/plan.ts
|
||
// `plan` (cyclo 33 / CRAP 36.7) are both pre-existing complexity —
|
||
// the PR only threads `outputResolutionAspectAgnostic` through the
|
||
// parseRenderOverrides/RenderInput/DistributedRenderConfig shape and
|
||
// adds one field spread inside `plan`. Neither function body gained
|
||
// branches, but the line-shift fingerprint re-flags the inherited
|
||
// complexity. The new re-target logic itself is extracted into
|
||
// `adaptAspectAgnosticResolution` in compileStage.ts to keep that
|
||
// stage's runCompileStage under the cyclo/cognitive thresholds.
|
||
"packages/producer/src/server.ts",
|
||
"packages/producer/src/services/distributed/plan.ts",
|
||
// Sibling-surface fix (PR #2529 R2): lambda.ts's top-level `run`
|
||
// (cyclo 39, CRAP 1560) is the big subcommand switch that pre-dates
|
||
// this PR. The change threads two additional variables through the
|
||
// `render` and `render-batch` branches (parsed resolution +
|
||
// aspect-agnostic flag) but adds no new branches. parseIntFlag /
|
||
// parseEnum (both cyclo 5, CRAP 30 — right at the threshold) are also
|
||
// pre-existing utility parsers; the file-level line shift after
|
||
// adding the shared parseOutputResolutionFlag call re-flags them at
|
||
// the boundary. All three findings are inherited complexity, not new
|
||
// branches introduced by the aspect-agnostic threading.
|
||
"packages/cli/src/commands/lambda.ts",
|
||
// Sibling-surface fix (PR #2529 R2): lambda/render.ts's
|
||
// `waitForCompletion` (cyclo 11, CRAP 37.1) is the pre-existing SFN
|
||
// progress-poll loop. This PR only adds `outputResolutionAspectAgnostic`
|
||
// to `RenderArgs` + a two-line extraction (`buildLambdaRenderConfig`);
|
||
// `waitForCompletion` is untouched. Line-shift fingerprint re-flags
|
||
// the inherited complexity.
|
||
"packages/cli/src/commands/lambda/render.ts",
|
||
// Thumbnail id-escape fix (via/thumbnail-id-escape): picker.ts has five
|
||
// pre-existing inherited-complexity findings (isEffectivelyHidden,
|
||
// isPickableElement, buildElementLabel, getPickCandidatesFromPoint,
|
||
// pickManyAtPoint — all in this file at the parent SHA). This PR's only
|
||
// logic edit inside picker.ts is a single-line change to buildElementSelector
|
||
// (`#${htmlEl.id}` → `#${CSS.escape(htmlEl.id)}`) plus a three-line comment;
|
||
// the added lines shift every function below buildElementSelector, and Fallow's
|
||
// file-level fingerprint invalidation re-flags the inherited findings even at
|
||
// unchanged line numbers.
|
||
"packages/core/src/runtime/picker.ts",
|
||
// generate-catalog-payloads.ts: hostsOwnDirectory, parseArgs and generate (the
|
||
// former main body, moved unchanged) are untouched. buildPayload's canvas-draw-element branch now writes a marker
|
||
// via a small writePayload helper instead of dropping the payload, but at
|
||
// the same branch count — its flagged 14-branch CRAP score predates this PR.
|
||
"scripts/generate-catalog-payloads.ts",
|
||
// The inspector service and injected runtime are orchestration boundaries:
|
||
// protocol validation, browser lifecycle, and source mapping are kept
|
||
// together so cleanup and generation checks remain auditable.
|
||
"packages/inspector/src/service.ts",
|
||
"packages/inspector/src/sources.ts",
|
||
"packages/inspector/src/server.ts",
|
||
"packages/core/src/runtime/inspection.ts",
|
||
"packages/inspector/tests/film.ts",
|
||
"packages/inspector/src/mapInspection.ts",
|
||
"packages/inspector/src/live.ts",
|
||
"packages/inspector/src/elementMap.js",
|
||
"packages/inspector/src/sourceDependencies.ts",
|
||
"packages/core/src/runtime/timelineInspection.ts",
|
||
"packages/cli/src/commands/timeline.ts",
|
||
// Protocol validators and deterministic report formatters enumerate wire
|
||
// variants explicitly; splitting those branches would scatter one contract.
|
||
"packages/inspector/src/requests.ts",
|
||
"packages/inspector/src/timelineReport.ts",
|
||
"packages/inspector/src/pageQueries.ts",
|
||
"packages/core/src/runtime/timelineValues.ts",
|
||
],
|
||
},
|
||
}
|