dsh-hyperframes 0.9.3 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -2
- package/README.en.md +3 -1
- package/README.md +3 -1
- package/docs/USAGE.en.md +2 -2
- package/docs/USAGE.md +2 -2
- package/docs/VALIDATION.md +4 -0
- package/docs/validation-0.10.0.md +12 -0
- package/docs/validation-0.10.1.md +7 -0
- package/lib/client.js +18 -3
- package/lib/media-store.d.ts +2 -0
- package/lib/media-store.js +15 -0
- package/lib/media-templates.d.ts +1 -1
- package/lib/media-templates.js +1 -1
- package/lib/media-workbench.js +3 -0
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/skills/UPSTREAM.json +22 -30
- package/skills/hyperframes/SKILL.md +1 -1
- package/skills/hyperframes/references/format.md +1 -0
- package/skills/hyperframes-cli/references/beats.md +2 -0
- package/skills/hyperframes-cli/references/lint-validate-inspect.md +2 -2
- package/skills/hyperframes-registry/references/contributing.md +4 -4
- package/skills/media-use/UPSTREAM.gitignore +1 -0
- package/skills/media-use/references/grading.md +2 -0
- package/skills/media-use/references/local.md +1 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/UPSTREAM.gitignore +1 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/UPSTREAM.gitignore +10 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/UPSTREAM.gitignore +14 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/UPSTREAM.gitignore +10 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
更新记录
|
|
1
|
+
# 更新记录
|
|
3
2
|
|
|
4
3
|
[返回简介](README.md) · [使用说明](docs/USAGE.md) · [验证记录](docs/VALIDATION.md)
|
|
5
4
|
|
|
5
|
+
## 0.10.1 (2026-10-28)
|
|
6
|
+
|
|
7
|
+
- 同步官方 HyperFrames 0.8.211:7 个当前技能、301 项资源逐一比对发布提交;更新两处上游文档,并固定新的 CLI 与渲染环境版本。
|
|
8
|
+
|
|
9
|
+
## 0.10.0 (2026-10-28)
|
|
10
|
+
|
|
11
|
+
- 素材页支持上移/下移图片,显示播放序号,立即保存并校验工程修订;不改音频/视频位置和旧成品。
|
|
12
|
+
- Add keyboard-accessible image ordering without re-uploading. Existing renders remain available; export again to apply the new order.
|
|
13
|
+
- 同步官方 HyperFrames 0.8.209 的当前技能、资源和固定 CLI;记录上游提交与校验值。技能文本固定 LF,避免 Windows 检出换行转换导致完整性检查失败。
|
|
14
|
+
|
|
6
15
|
## 0.9.3 (2026-10-27)
|
|
7
16
|
|
|
8
17
|
- 修复分批更新时的新旧更新控件混用:保留原页面、草稿与安装保护,空闲后接管旧控制器,兼容旧入口。
|
package/README.en.md
CHANGED
|
@@ -12,7 +12,9 @@ Feedback and contributions are welcome: report [issues](https://github.com/STARD
|
|
|
12
12
|
|
|
13
13
|
Open the new native sidebar workbench after updating and restarting DSH. Settings remains available. See the [workbench guide and validation boundaries](docs/WORKBENCH.md).
|
|
14
14
|
|
|
15
|
-
Bundled skills: official HyperFrames 0.8.
|
|
15
|
+
Bundled skills: official HyperFrames 0.8.209, seven current skills with fourteen previous names retained as compatibility entries.
|
|
16
|
+
|
|
17
|
+
Move images up or down in the Media tab, including with the keyboard. The order saves immediately; export again to apply it to a new MP4.
|
|
16
18
|
|
|
17
19
|
## What it does
|
|
18
20
|
|
package/README.md
CHANGED
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
|
|
13
13
|
更新并重启 DSH 后,可从原生侧栏打开新版工作台,原设置入口继续保留。详见[工作台说明与验收范围](docs/WORKBENCH.md)。
|
|
14
14
|
|
|
15
|
-
技能内容:官方 HyperFrames 0.8.
|
|
15
|
+
技能内容:官方 HyperFrames 0.8.209,7 个当前技能;14 个旧名称保留为兼容入口。
|
|
16
|
+
|
|
17
|
+
在「素材」页上移或下移图片即可调整轮播顺序,支持键盘操作。顺序立即保存;重新导出后应用于新 MP4。
|
|
16
18
|
|
|
17
19
|
## 功能
|
|
18
20
|
|
package/docs/USAGE.en.md
CHANGED
|
@@ -46,7 +46,7 @@ Open Settings → HyperFrames in DSH Web or Desktop.
|
|
|
46
46
|
|
|
47
47
|
1. Create a video. Select title card, product card or slideshow; set the title/body, canvas and an integer duration of 3–30 seconds, then save.
|
|
48
48
|
2. Upload local copies of PNG/JPEG images, one MP3/WAV background audio and one muted MP4 background video. Limits: 20 MB per asset, 40 MB total. Slideshows follow upload order and need at least two seconds per image.
|
|
49
|
-
3. Explicitly prepare the environment on first use. It downloads official CLI 0.8.
|
|
49
|
+
3. Explicitly prepare the environment on first use. It downloads official CLI 0.8.211; Windows uses its managed rendering browser, while other platforms reuse installed Chrome when available. Project editing remains available. FFmpeg must be installed and in PATH; restart DSH after changing PATH.
|
|
50
50
|
4. Start official Studio and inspect the picture. Stop this preview before editing or exporting. No window is opened automatically.
|
|
51
51
|
5. Export, play and download MP4. Later edits preserve earlier MP4s and display a revision warning. Export again for a new final output.
|
|
52
52
|
|
|
@@ -88,7 +88,7 @@ Node.js 22.19+ (22.x) / 24+ + FFmpeg (`npx hyperframes`).
|
|
|
88
88
|
|
|
89
89
|
## Porting notes
|
|
90
90
|
|
|
91
|
-
Synced from official HyperFrames 0.8.
|
|
91
|
+
Synced from official HyperFrames 0.8.211 release commit `5ed694264e9a48aebca0a0f29b94dbd30c2e29d0` (2026-10-28). All seven current official skills retain their upstream files. Fourteen previous names remain as compatibility entries that load current workflows. The upstream plugin launcher pins the CLI and blocks standalone skill replacement. Source hashes and the Apache-2.0 license are recorded under `skills/UPSTREAM.json` and `skills/UPSTREAM-LICENSE.txt`.
|
|
92
92
|
|
|
93
93
|
## Multi-harness
|
|
94
94
|
|
package/docs/USAGE.md
CHANGED
|
@@ -46,7 +46,7 @@ dsh plugin --profile web remove dsh-hyperframes
|
|
|
46
46
|
|
|
47
47
|
1. 新建视频,选择标题卡、产品介绍或图文轮播,填写标题/正文、画幅和 3–30 秒时长,明确保存。
|
|
48
48
|
2. 上传 PNG/JPEG、一个背景音频(MP3/WAV)、一个静音背景视频(MP4)的副本。每个文件最多 20 MB、总计 40 MB;轮播按上传顺序,每张至少两秒。
|
|
49
|
-
3. 首次点击「准备渲染环境」。此时下载固定版本官方 CLI 0.8.
|
|
49
|
+
3. 首次点击「准备渲染环境」。此时下载固定版本官方 CLI 0.8.211;Windows 下载官方专用渲染浏览器,其他系统优先复用已安装的 Chrome;可以继续编辑工程。下载失败保留工程,查看运行记录后重试。需先安装 FFmpeg 并加入 PATH,重启 DSH 后生效。
|
|
50
50
|
4. 启动官方 Studio,检查画面。停止本次预览后再编辑或导出;不会自动打开或占用前台窗口。
|
|
51
51
|
5. 导出 MP4、在工作台播放并下载。工程更新后保留旧成品并显示旧修订提醒;再次导出即可生成新成片。
|
|
52
52
|
|
|
@@ -92,7 +92,7 @@ Node.js 22.19+ (22.x) / 24+ + FFmpeg(`npx hyperframes`)。
|
|
|
92
92
|
|
|
93
93
|
## 移植说明
|
|
94
94
|
|
|
95
|
-
技能同步自官方 `heygen-com/hyperframes` 的 0.8.
|
|
95
|
+
技能同步自官方 `heygen-com/hyperframes` 的 0.8.211 发布提交 `5ed694264e9a48aebca0a0f29b94dbd30c2e29d0`(2026-10-28)。当前 7 个官方技能完整保留原文、脚本与资源;原来的 14 个旧名称改为兼容入口,转向当前技能,避免继续使用已合并的旧工作流。上游插件启动器固定 CLI 版本,并禁止独立技能更新命令覆盖 DSH 管理的包。来源、完整性与 Apache-2.0 许可证见 `skills/UPSTREAM.json` 和 `skills/UPSTREAM-LICENSE.txt`。
|
|
96
96
|
|
|
97
97
|
## 跨平台使用
|
|
98
98
|
|
package/docs/VALIDATION.md
CHANGED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# 0.10.0 图片排序验收
|
|
2
|
+
|
|
3
|
+
2026-10-28,Windows / Node 24.16 / 官方 DSH 0.2.1-rc.3 Web,后台 Chrome / Playwright。Browser plugin 不可用,因此采用本地 Playwright,不切换用户前台窗口。
|
|
4
|
+
|
|
5
|
+
- 实际创建轮播工程,上传三张有效 PNG,用鼠标和键盘调整顺序,关闭详情再打开验证持久化。
|
|
6
|
+
- 真正准备官方渲染环境并导出 6 秒 MP4,下载后在 1/3/5 秒抽帧,逐张查看确认绿色、蓝色、红色顺序;再次移动图片后旧 MP4 的 SHA-256 保持一致,界面提示重新导出。
|
|
7
|
+
- 中文浅色、英文深色及 390px 窄屏实际操作;窄屏按钮也实际点击,图片重新排列成功;未捕获页面异常。
|
|
8
|
+
- 后端覆盖图片完整排列、重复/缺失/外来 ID、旧修订、空操作、混合音频位置、文件字节和旧渲染记录保留。
|
|
9
|
+
|
|
10
|
+
同步官方 HyperFrames 0.8.209 发布提交 53c975966611e7012b09b6d46707c26511ea077d 的 7 个当前技能与 301 个资源;14 个旧技能名称保留。5 个被 npm 固定过滤的开发元数据通过记录的 UPSTREAM.gitignore 副本分发,原始路径、内容哈希和别名映射均保留,实际打包清单逐项核对。技能文本固定 LF,避免 Windows Git 检出换行导致校验失败。
|
|
11
|
+
|
|
12
|
+
未测:Electron 专属菜单、全部模板/格式组合、所有外部媒体与真实业务项目。受控测试素材不代表任意用户项目。自动安装继续默认关闭。
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# 0.10.1 验证记录(2026-10-28)
|
|
2
|
+
|
|
3
|
+
同步官方 HyperFrames 0.8.211,发布提交 5ed694264e9a48aebca0a0f29b94dbd30c2e29d0。7 个当前技能、301 项资源逐一验证 Git blob,2 项上游文档变化已同步;14 个旧名称兼容入口保留。CLI、插件清单及工作台渲染环境使用同一固定版本。
|
|
4
|
+
|
|
5
|
+
Windows 48 项回归通过、0 跳过。官方 DSH 0.2.1-rc.4 隔离 profile 的工作台桌面、390px 窄屏及默认关闭自动安装已检查。另经实际 MediaWorkbench 准备官方环境、导出 720×720、24 FPS、6 秒 H.264 MP4,并用 ffprobe 和解码画面核对红/绿/蓝三张素材顺序。渲染不是模拟子进程;本轮导出由实际工作台类调用,最终公开安装另验插件加载与界面。
|
|
6
|
+
|
|
7
|
+
未操作用户前台窗口;Electron 原生窗口及 Linux/macOS 渲染没有在本轮验收。上游链接:https://github.com/heygen-com/hyperframes/tree/5ed694264e9a48aebca0a0f29b94dbd30c2e29d0 。
|
package/lib/client.js
CHANGED
|
@@ -611,13 +611,24 @@ function MediaCanvas({ project, fields, render, dirty, stale, job, running, read
|
|
|
611
611
|
function MediaAssets({ project, dirty, running, fileRef, upload, perform, setProject, t }) {
|
|
612
612
|
const [remove, setRemove] = useState(null);
|
|
613
613
|
if (!project) return h(W.Empty, { title: t('先保存工程,再添加素材', 'Save the project before adding media'), icon: 'video' }, t('填写标题并点击上方“保存工程”。', 'Enter a title and choose Save project above.'));
|
|
614
|
+
const imageIds = project.assets.filter(asset => asset.kind === 'image').map(asset => asset.id);
|
|
615
|
+
const move = (asset, offset) => perform(async () => {
|
|
616
|
+
const order = [...imageIds], index = order.indexOf(asset.id), next = index + offset;
|
|
617
|
+
if (index < 0 || next < 0 || next >= order.length) return;
|
|
618
|
+
[order[index], order[next]] = [order[next], order[index]];
|
|
619
|
+
setProject(await api({ action: 'reorderImages', id: project.id, revision: project.revision, imageIds: order }));
|
|
620
|
+
});
|
|
614
621
|
return h('section', { className: 'media-assets-view' },
|
|
615
622
|
h('div', { className: 'w-toolbar' }, h('h3', null, t('工程素材', 'Project media') + ' · ' + project.assets.length), h(W.Button, { icon: 'upload', disabled: running || dirty, onClick: () => fileRef.current?.click() }, t('上传素材', 'Upload media'))),
|
|
616
|
-
h('p', { className: 'w-muted' }, t('PNG/JPEG 图片、一个背景音频和一个静音背景视频;每个 ≤20 MB,总共 ≤40 MB
|
|
623
|
+
h('p', { className: 'w-muted' }, t('PNG/JPEG 图片、一个背景音频和一个静音背景视频;每个 ≤20 MB,总共 ≤40 MB。轮播按下方图片顺序,每张至少两秒。', 'PNG/JPEG images, one background audio and one muted background video; each ≤20 MB, total ≤40 MB. Slideshow follows the image order below, at least two seconds per image.')),
|
|
624
|
+
imageIds.length > 1 ? h('p', { className: 'w-muted' }, t('上移或下移图片后立即保存。已导出的 MP4 保持原样,请重新导出以应用新顺序。', 'Moving an image saves its order immediately. Existing MP4s are preserved; export again to apply the new order.')) : null,
|
|
617
625
|
dirty ? h(W.Status, null, t('请先保存修改,再上传或移除素材副本。', 'Save changes before uploading or removing media copies.')) : null,
|
|
618
626
|
h('input', { ref: fileRef, type: 'file', accept: '.png,.jpg,.jpeg,.mp3,.wav,.mp4', disabled: running || dirty, onChange: upload, 'aria-label': t('上传素材副本', 'Upload a media copy'), style: { display: 'none' } }),
|
|
619
627
|
project.assets.length ? h('ul', { className: 'media-asset-list' }, project.assets.map(asset => h('li', { key: asset.id }, asset.kind === 'image' ? h('img', { src: urlFor(project, 'asset', { asset: asset.id }), alt: asset.name }) : h(W.Icon, { name: asset.kind === 'video' ? 'video' : 'file', size: 28 }),
|
|
620
|
-
h('div', null, h('strong', null, asset.name), h('p', { className: 'w-muted' }, asset.kind + ' · ' + Math.ceil(asset.bytes / 1024) + ' KB')),
|
|
628
|
+
h('div', null, h('strong', null, asset.name), h('p', { className: 'w-muted' }, (asset.kind === 'image' ? t('图片 ', 'Image ') + (imageIds.indexOf(asset.id) + 1) + ' / ' + imageIds.length : asset.kind === 'audio' ? t('背景音频', 'Background audio') : t('背景视频', 'Background video')) + ' · ' + Math.ceil(asset.bytes / 1024) + ' KB')),
|
|
629
|
+
asset.kind === 'image' && imageIds.length > 1 ? h('div', { className: 'w-toolbar media-asset-order' },
|
|
630
|
+
h(W.Button, { variant: 'ghost', disabled: running || dirty || imageIds.indexOf(asset.id) === 0, 'aria-label': t('上移图片:', 'Move image up: ') + asset.name, onClick: () => move(asset, -1) }, t('上移', 'Move up')),
|
|
631
|
+
h(W.Button, { variant: 'ghost', disabled: running || dirty || imageIds.indexOf(asset.id) === imageIds.length - 1, 'aria-label': t('下移图片:', 'Move image down: ') + asset.name, onClick: () => move(asset, 1) }, t('下移', 'Move down'))) : null,
|
|
621
632
|
h(W.Button, { variant: 'ghost', icon: 'trash', disabled: running || dirty, onClick: () => setRemove(asset) }, t('移除上传副本', 'Remove uploaded copy'))))) : h(W.Empty, { title: t('还没有上传素材', 'No media uploaded yet'), icon: 'video' }, t('标题卡可以直接导出。需要图片或配乐时,再上传自己的素材。', 'Title cards can be exported as they are. Upload your own media when you need images or music.')),
|
|
622
633
|
remove ? h(W.Dialog, { title: t('移除素材副本', 'Remove media copy'), closeLabel: t('取消', 'Cancel'), busy: running, onClose: () => setRemove(null) }, h('p', null, remove.name), h('p', { className: 'w-muted' }, t('仅移除本工程中的上传副本,原文件保留。', 'Only the uploaded project copy is removed. Your original file is preserved.')), h('div', { className: 'w-toolbar' }, h(W.Button, { variant: 'danger', disabled: running || dirty, onClick: () => perform(async () => { setProject(await api({ action: 'removeAsset', id: project.id, revision: project.revision, asset: remove.id })); setRemove(null); }) }, t('确认移除副本', 'Confirm removal')), h(W.Button, { disabled: running, onClick: () => setRemove(null) }, t('取消', 'Cancel')))) : null);
|
|
623
634
|
}
|
|
@@ -648,6 +659,10 @@ const MEDIA_WORKBENCH_CSS = `
|
|
|
648
659
|
return message;
|
|
649
660
|
if (error?.status === 401)
|
|
650
661
|
return 'Your session expired. Reopen DSH and try again.';
|
|
662
|
+
if (/调整图片顺序需要/.test(message))
|
|
663
|
+
return 'Reload the project before changing its image order.';
|
|
664
|
+
if (/图片顺序/.test(message))
|
|
665
|
+
return 'Use every current image exactly once. Reload the project before trying again.';
|
|
651
666
|
if (/先归档|已达 30/.test(message))
|
|
652
667
|
return 'The 30 active project slots are full. Archive another project before creating or restoring one.';
|
|
653
668
|
if (/已有预览或渲染/.test(message))
|
|
@@ -844,7 +859,7 @@ h('div', { className: 'bar' }, h('button', { disabled: busy || dirty || activeJo
|
|
|
844
859
|
catch { } W.register(ctx,{id:'dsh-'+engine+'.workbench',label:()=>title,icon:engine==='hyperframes'?'layers':'play',component:Workbench,inject:()=>({locale}),order:engine==='hyperframes'?65:66});
|
|
845
860
|
ctx.slots.inject('settings.section', () => ctx.slots.register({ name: 'settings.section', id: 'dsh-' + engine, order: engine === 'hyperframes' ? 62 : 63, label: () => title, inject: () => ({ locale }) }, Workbench)); }
|
|
846
861
|
return { inject: ['slots', 'locale'], apply };
|
|
847
|
-
} },{"name":"dsh-hyperframes","version":"0.1.0","hasWorkbench":true,"packageVersion":"0.
|
|
862
|
+
} },{"name":"dsh-hyperframes","version":"0.1.0","hasWorkbench":true,"packageVersion":"0.10.1","label":"HyperFrames","labelEn":"HyperFrames","suiteComponent":true}));
|
|
848
863
|
|
|
849
864
|
})();
|
|
850
865
|
|
package/lib/media-store.d.ts
CHANGED
|
@@ -17,6 +17,8 @@ export declare class MediaStore {
|
|
|
17
17
|
create(value: unknown): Promise<MediaProject>;
|
|
18
18
|
edit(id: string, revision: unknown, fn: (p: MediaProject) => Promise<void> | void, bump?: boolean): Promise<MediaProject>;
|
|
19
19
|
update(id: string, revision: unknown, value: unknown): Promise<MediaProject>;
|
|
20
|
+
/** Reorder existing images atomically; audio/video slots and uploaded bytes stay intact. */
|
|
21
|
+
reorderImages(id: string, revision: unknown, order: unknown): Promise<MediaProject>;
|
|
20
22
|
assetBytes(id: string, asset: MediaAsset): Promise<Buffer>;
|
|
21
23
|
upload(id: string, revision: unknown, name: string, bytes: Buffer): Promise<MediaProject>;
|
|
22
24
|
removeAsset(id: string, revision: unknown, assetId: string): Promise<MediaProject>;
|
package/lib/media-store.js
CHANGED
|
@@ -132,6 +132,21 @@ export class MediaStore {
|
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
134
|
async update(id, revision, value) { return this.edit(id, revision, p => { Object.assign(p, validateFields(value)); }); }
|
|
135
|
+
/** Reorder existing images atomically; audio/video slots and uploaded bytes stay intact. */
|
|
136
|
+
async reorderImages(id, revision, order) {
|
|
137
|
+
if (!Number.isInteger(revision) || Number(revision) < 1)
|
|
138
|
+
throw new Error('调整图片顺序需要当前工程修订号。');
|
|
139
|
+
return this.edit(id, revision, p => {
|
|
140
|
+
const images = p.assets.filter(a => a.kind === 'image'), byId = new Map(images.map(a => [a.id, a]));
|
|
141
|
+
if (!Array.isArray(order) || order.length !== images.length || new Set(order).size !== images.length || order.some(id => typeof id !== 'string' || !byId.has(id)))
|
|
142
|
+
throw new Error('图片顺序必须包含当前项目的全部图片,且每张只出现一次。');
|
|
143
|
+
if (images.every((asset, index) => asset.id === order[index]))
|
|
144
|
+
return;
|
|
145
|
+
let index = 0;
|
|
146
|
+
p.assets = p.assets.map(asset => asset.kind === 'image' ? byId.get(order[index++]) : asset);
|
|
147
|
+
p.revision++;
|
|
148
|
+
}, false);
|
|
149
|
+
}
|
|
135
150
|
async assetBytes(id, asset) {
|
|
136
151
|
const file = join(await this.path(id), 'assets', asset.file);
|
|
137
152
|
await this.checkPath(file);
|
package/lib/media-templates.d.ts
CHANGED
package/lib/media-templates.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const MEDIA_VERSIONS = { hyperframes: '0.8.
|
|
1
|
+
export const MEDIA_VERSIONS = { hyperframes: '0.8.211', remotion: '4.0.539', gsap: '3.15.0' };
|
|
2
2
|
export const MEDIA_TEMPLATES = [
|
|
3
3
|
{ id: 'title', zh: '标题卡', en: 'Title card', description: '一句标题、一段介绍,适合开场与通知。' },
|
|
4
4
|
{ id: 'product', zh: '产品介绍', en: 'Product card', description: '深色画布与一张主图,适合产品亮点。' },
|
package/lib/media-workbench.js
CHANGED
|
@@ -401,6 +401,9 @@ export class MediaWorkbench {
|
|
|
401
401
|
case 'removeAsset':
|
|
402
402
|
value = await this.store.removeAsset(mediaId(v.id), v.revision, mediaId(v.asset));
|
|
403
403
|
break;
|
|
404
|
+
case 'reorderImages':
|
|
405
|
+
value = await this.store.reorderImages(mediaId(v.id), v.revision, v.imageIds);
|
|
406
|
+
break;
|
|
404
407
|
case 'archive':
|
|
405
408
|
case 'restore': {
|
|
406
409
|
if (v.confirmed !== true)
|
package/package.json
CHANGED
package/plugin.json
CHANGED
package/skills/UPSTREAM.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hyperframes",
|
|
3
|
-
"version": "0.8.
|
|
4
|
-
"gitHead": "
|
|
5
|
-
"tarball": "https://registry.npmjs.org/hyperframes/-/hyperframes-0.8.
|
|
6
|
-
"integrity": "sha512-
|
|
3
|
+
"version": "0.8.211",
|
|
4
|
+
"gitHead": "5ed694264e9a48aebca0a0f29b94dbd30c2e29d0",
|
|
5
|
+
"tarball": "https://registry.npmjs.org/hyperframes/-/hyperframes-0.8.211.tgz",
|
|
6
|
+
"integrity": "sha512-v1ptp7VmmqXJs5s1GgJ87EY9fA3Uue1eebX+Fq1vq6ApffyKJAuZRNRRASh1A6qENG5BejjMrkxQF3uJr5QX+g==",
|
|
7
7
|
"node": ">=22",
|
|
8
8
|
"canonical": [
|
|
9
9
|
"figma",
|
|
@@ -31,14 +31,11 @@
|
|
|
31
31
|
"talking-head-recut"
|
|
32
32
|
],
|
|
33
33
|
"repository": "https://github.com/heygen-com/hyperframes",
|
|
34
|
-
"checkedAt": "2026-10-
|
|
34
|
+
"checkedAt": "2026-10-28",
|
|
35
35
|
"adaptation": "Official canonical files unchanged; DSH compatibility aliases and upstream launcher manifest.",
|
|
36
36
|
"files": {
|
|
37
|
-
"embedded-captions/SKILL.md": "3ffc067b68d5917dadb48264aa258c9382976d9b8e744b855e0e63df4e356ffd",
|
|
38
|
-
"faceless-explainer/SKILL.md": "3f694998895cd472e4de3d8cb720028fc091d032f29140f690edfb103d5d8cb8",
|
|
39
37
|
"figma/scripts/verify-motion.mjs": "1988721525e929caa5d3ced6d16c31467996e0c57757d281a971fb77e2297de8",
|
|
40
38
|
"figma/SKILL.md": "d9537758a88bf3cbfc5699167742e437a6791c57c0180556c930ec6c3aae0ab6",
|
|
41
|
-
"general-video/SKILL.md": "36af528283588750eb6283a23cf1c34aa8042fae6fae4e54928a5151b57f1d21",
|
|
42
39
|
"hyperframes/assets/frame-presets/biennale-yellow/caption-skin.html": "b0e4812d9cb5852969be276f8a98ffa2b293ba8cc902fababae3f3f6340088c3",
|
|
43
40
|
"hyperframes/assets/frame-presets/biennale-yellow/frame-showcase.html": "5ba04e47cf9897e023dcfa49e1ec26fe26bac0c5061097dc6e7cb1d9ed46d7d0",
|
|
44
41
|
"hyperframes/assets/frame-presets/biennale-yellow/FRAME.md": "76d22cced9c152b0edb520543cf34c4ce772a312caa7211c40d4315b53c053cf",
|
|
@@ -89,7 +86,7 @@
|
|
|
89
86
|
"hyperframes/assets/frame-presets/editorial-forest/FRAME.md": "ceeb2ab768367da1e1f3e1eca36ab9feeb3de3e4d15493319b0044c3d869329c",
|
|
90
87
|
"hyperframes/references/captions.md": "e7e2af7eace992487baa455bfa703fb3d770fb29f36732541554e60a46896d54",
|
|
91
88
|
"hyperframes/references/film.md": "b684403f725cf720b9f192bafd420ca55f24060114004234a4e46a715de7a183",
|
|
92
|
-
"hyperframes/references/format.md": "
|
|
89
|
+
"hyperframes/references/format.md": "babb5d4bfeffa8422c8e3474833a827a2a3dd95d234e8a37c130c4973d360533",
|
|
93
90
|
"hyperframes/references/look.md": "5128a54cdb75bca2f627170e4a3a9667f4f11cf1579301fc16c53862c29c3ad3",
|
|
94
91
|
"hyperframes/references/motion.md": "80b9bd70c011b7fc679f351cb41b993b16d610af1cda316eaf9d19bf9c08372f",
|
|
95
92
|
"hyperframes/references/overlays.md": "d87fa3d13e8e0dace593f4aafb68c085b7f4393eee468c7695a74d5665150da3",
|
|
@@ -115,10 +112,8 @@
|
|
|
115
112
|
"hyperframes/scripts/locate.mjs": "9274b1b63a74b305f044dfd907ae5ddae538d566d31c23b81c39975be6317147",
|
|
116
113
|
"hyperframes/scripts/plugin-cli.mjs": "1ec46cdb9d819ecc9367aba719fea9253089617ead8c5454e59ab18b206711fb",
|
|
117
114
|
"hyperframes/scripts/plugin-cli.test.mjs": "abfdf2498b57509438077803bee3a626c6fc13e1014ae066e5281edbfc4ca23d",
|
|
118
|
-
"hyperframes/SKILL.md": "
|
|
119
|
-
"hyperframes-
|
|
120
|
-
"hyperframes-audio/SKILL.md": "5afd67113b389c5db2724149e1491cdeacf75962183af3ea36e78308da7dbd04",
|
|
121
|
-
"hyperframes-cli/references/beats.md": "09689994eba8c977693fdc54702b07dd492e80aa47075de0a027df901dc51b1d",
|
|
115
|
+
"hyperframes/SKILL.md": "96f3793bd677dde345c5aca4aa6484334100a154e8a5d9e2ad07d69c9b9e2b0e",
|
|
116
|
+
"hyperframes-cli/references/beats.md": "a14417f6308c1bb5cae7f1244635abb634003a1befe0972666924a2a2078751e",
|
|
122
117
|
"hyperframes-cli/references/cloud.md": "8191550a036130249c26b37912dfd321c771c6670223cc7e0fff7aedd67607bf",
|
|
123
118
|
"hyperframes-cli/references/cloudrun.md": "16f46a18ee3d165dba3b7ee50362bb32cb0a927643a90821e7b63494fe0bde83",
|
|
124
119
|
"hyperframes-cli/references/compare-and-batch.md": "d17fa5a16707d981fa6473b99a28aa45abf41bca0fd96c5157c632abd0bfc222",
|
|
@@ -127,17 +122,14 @@
|
|
|
127
122
|
"hyperframes-cli/references/feedback.md": "ae188d5c3e90f0e011b1e322bbfbe10575667b2a5073cffdac05026ac59925a7",
|
|
128
123
|
"hyperframes-cli/references/init-and-scaffold.md": "dad4c2212f6df8ed4ff8d7b8154c2f8a6bdeec0fa27562b0b6c4d8da9d2e1078",
|
|
129
124
|
"hyperframes-cli/references/lambda.md": "80b8ce187a1dec26bf8bed682cdd1415a79a5d72ba6ef07650c58f5d3795845b",
|
|
130
|
-
"hyperframes-cli/references/lint-validate-inspect.md": "
|
|
125
|
+
"hyperframes-cli/references/lint-validate-inspect.md": "8144df629f9b913e1237539f2eafa24d8413be0ec4cf694264c6eab33b903904",
|
|
131
126
|
"hyperframes-cli/references/preview-render.md": "851d85d7f4e6939d90ed6e350180a8edadc67b44dfc5d19163376485324d00b2",
|
|
132
127
|
"hyperframes-cli/references/upgrade-info-misc.md": "a46662ad866669d1cf70bfa6404e9a01f68d2db4eb667fe6dc8a8442f6a069d8",
|
|
133
128
|
"hyperframes-cli/SKILL.md": "44a48ccfa4cbd4f4234f8306c96268a4be56a0f2376abedbf31d2167b3c21286",
|
|
134
|
-
"hyperframes-core/SKILL.md": "b9c5d7dbbe8ff1a858776f87636ba541cd233ebe44b9f7140adefa12aaf97be9",
|
|
135
|
-
"hyperframes-creative/SKILL.md": "22208406818ebd96c43f68c4c81f8f737d7f604db76206daecc86b3d2d56a8f2",
|
|
136
|
-
"hyperframes-keyframes/SKILL.md": "c0dc5309170b1032440635b37c891bf4fe7a0c6a8965bf2df2c4ce1661fa6b34",
|
|
137
129
|
"hyperframes-registry/examples/add-block.md": "0e3353755c4ef55e53570d1266a4a43b2c5aef9bbe41276430e38cfa6580b83a",
|
|
138
130
|
"hyperframes-registry/examples/add-component.md": "d06992d31eec617a91f5c34630c9274c52dd07898bd24f10a869d0d1cab5af29",
|
|
139
131
|
"hyperframes-registry/references/component-quality-bar.md": "f0d4c3c44131bc0791f8a8cc3d2d7478d38045451775af7d20b2dd47cf5f91ac",
|
|
140
|
-
"hyperframes-registry/references/contributing.md": "
|
|
132
|
+
"hyperframes-registry/references/contributing.md": "3724d1dd269768da26b731f6592ac749f47f62443e909f881ac12ceba36db0fa",
|
|
141
133
|
"hyperframes-registry/references/demo-html-pattern.md": "dfc50cd33eff2c2be75437786fc3e851ab0085f7d453fb35b3380ecf9a6e9f04",
|
|
142
134
|
"hyperframes-registry/references/discovery.md": "ca82fcc1e0b2d824b72a8bda99b60d257b23d493fa1d28adbb0548a762cacd04",
|
|
143
135
|
"hyperframes-registry/references/install-locations.md": "83793e7d6aeea9a751755e4bd23ea48182ff9af082287b98a1192343d2571dd1",
|
|
@@ -147,7 +139,6 @@
|
|
|
147
139
|
"hyperframes-registry/references/wiring-blocks.md": "397f9ad5a9244d173b97bb5a5dfe76ea3cbccfb8dde16cba8b3dabc6044b011a",
|
|
148
140
|
"hyperframes-registry/references/wiring-components.md": "6c8341c29fdae6de4f9fd1560a668d11cf34731b81fe5a06c9aeb4a000047b2a",
|
|
149
141
|
"hyperframes-registry/SKILL.md": "1c7b27632c9ea9febaafc2d9af073b377029f46be4bee70d75b5e713eb698423",
|
|
150
|
-
"hyperframes-studio/SKILL.md": "b28c9dd27ae9d7ca2c7fdeb8b897c41f2a03489b7830fc2cfc970d4f3fa594d5",
|
|
151
142
|
"media-use/.gitignore": "a299ec0fcdb6bc6670cf9fb22eefe3fcc37730e2e554b7f54e25de88be1ede02",
|
|
152
143
|
"media-use/audio/assets/sfx/chime.mp3": "74823b1b27703c56e0652db838f503c150ce9c2442d47d27430af3d5121d6d12",
|
|
153
144
|
"media-use/audio/assets/sfx/click-soft.mp3": "075e17bdac5c13662a1c9530050e0046f81d4138e00eb3bf30427a7b4404103d",
|
|
@@ -223,8 +214,8 @@
|
|
|
223
214
|
"media-use/luts/index.json": "988ac83c14bc3a9ef09aa6ab64459a0aa9e766e96361738136970ec89df1675a",
|
|
224
215
|
"media-use/luts/README.md": "c06cbbf2aab80cbf8aa25c83497202a63107a61e083b6c199a89d513e8096a3b",
|
|
225
216
|
"media-use/references/audio.md": "4c2602fec675b5234b18a0a03ac05aa6c380398c75176c6a071ce683d5107973",
|
|
226
|
-
"media-use/references/grading.md": "
|
|
227
|
-
"media-use/references/local.md": "
|
|
217
|
+
"media-use/references/grading.md": "430e2b57dfb64c3acfbdd02317ba967ebb580d42b348686ccffbc175d3de8392",
|
|
218
|
+
"media-use/references/local.md": "659271d787fe3bdd39f0bc32b1eeb03860b9c76c2672cb71b6bb8d4a88fe4385",
|
|
228
219
|
"media-use/references/media-treatment-recipes.md": "852e7e978af56c9e99ba14f19009da974cd78f99b399ca194dc416c31c49bda5",
|
|
229
220
|
"media-use/references/media-treatments.md": "2125e106e7f891e14716efabda40f5d6a46284592c6f37d5a14b2b86bda96c1a",
|
|
230
221
|
"media-use/references/memory.md": "55477edafb7f9c8294cafd3f1633b7a1820d538695c0868f9c3ddb6b418dadbc",
|
|
@@ -264,11 +255,6 @@
|
|
|
264
255
|
"media-use/scripts/transcript-cut.mjs": "17e148571738ad8cf30b0ccb3f28d0837df5072114b9dfb63bc8d9f5d25e5a5d",
|
|
265
256
|
"media-use/scripts/transcript-cut.test.mjs": "af546cd7d473eb5f4258148a8dd8ec637a67a242cd50948abe1e0dcd6f64c527",
|
|
266
257
|
"media-use/SKILL.md": "ef3976a02ff516d8e5ed0b7fff19d4bbf9358264233bace33fdacaa3aa7f37de",
|
|
267
|
-
"motion-graphics/SKILL.md": "838123af55a57cc7dd2a8b282c7d1276abf96c6235c1995b100b2f214d8ecea3",
|
|
268
|
-
"music-to-video/SKILL.md": "4731b05a7f3b43f6841ec58276798f49b1824a8c59c2b10d3f8d3c4fff69de24",
|
|
269
|
-
"NOTICE.md": "f2aea39bd23e81d314b277486e38eafebf2192559d8adab99146e939c10197f9",
|
|
270
|
-
"pr-to-video/SKILL.md": "e915ec3819620d1b08883b1c1f046c613f00d1a6faa7dce63bcb6bec215e8776",
|
|
271
|
-
"product-launch-video/SKILL.md": "e390dc1b198f1e3d0cbde4dbbbfc4600721031568f754fce5fd96da5e3cf7648",
|
|
272
258
|
"remotion-to-hyperframes/assets/.gitkeep": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
|
273
259
|
"remotion-to-hyperframes/assets/test-corpus/.gitignore": "975bd96543101813e4923824631bbca68bfba96107a4c872a74def48d8b001e6",
|
|
274
260
|
"remotion-to-hyperframes/assets/test-corpus/run.sh": "b6ceead2abf0f155ca816c2a696e0ea4db9d0b2d55bba5ad1407d65ccbd23399",
|
|
@@ -348,8 +334,14 @@
|
|
|
348
334
|
"remotion-to-hyperframes/scripts/tests/smoke.sh": "9a51cadfe9b6fe645096fc2e05d80849c6985abd3a92bd27cb985b3cdd3ce7b0",
|
|
349
335
|
"remotion-to-hyperframes/SKILL.md": "f6fb227e1a5d4fc47ed5375a24efc7bbc55b47a1ac2593825e63e34f6155ca63",
|
|
350
336
|
"slideshow/references/standalone-harness.md": "0f12d69a9c05a801291d923c7b1dbe666b29f3b68f6bb73d7c80681ae09df7e9",
|
|
351
|
-
"slideshow/SKILL.md": "4525f1a0d468f91957b638f14599c37f4af5e00c9b3c4df519a1cbe16101c908"
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
337
|
+
"slideshow/SKILL.md": "4525f1a0d468f91957b638f14599c37f4af5e00c9b3c4df519a1cbe16101c908"
|
|
338
|
+
},
|
|
339
|
+
"packagedPaths": {
|
|
340
|
+
"media-use/.gitignore": "media-use/UPSTREAM.gitignore",
|
|
341
|
+
"remotion-to-hyperframes/assets/test-corpus/.gitignore": "remotion-to-hyperframes/assets/test-corpus/UPSTREAM.gitignore",
|
|
342
|
+
"remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/.gitignore": "remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/UPSTREAM.gitignore",
|
|
343
|
+
"remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/.gitignore": "remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/UPSTREAM.gitignore",
|
|
344
|
+
"remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/.gitignore": "remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/UPSTREAM.gitignore"
|
|
345
|
+
},
|
|
346
|
+
"packagingNote": "npm filters .gitignore files. These five development metadata files are distributed under recorded UPSTREAM.gitignore aliases; contents and source hashes are unchanged."
|
|
355
347
|
}
|
|
@@ -26,7 +26,7 @@ Build what was asked: no voiceover or captions and no new aspect ratio unless th
|
|
|
26
26
|
7. Never `play()`, `pause()` or seek media. A `<video>` keeps its sound with `data-has-audio="true"`, else it is `muted`; music, voice, replacement sound and J/L cuts are a separate `<audio>`.
|
|
27
27
|
8. Every `<audio>` has an `id` or it is left out of the mix. No `crossorigin` on media. Time a `<video>` or its wrapper, never both.
|
|
28
28
|
9. Only the bundled fonts (`references/format.md`) resolve by name; any other family needs `@font-face` to a file in `assets/fonts/`.
|
|
29
|
-
10. Asset paths
|
|
29
|
+
10. Asset paths: `assets/...` (no leading `/`), in sub-compositions too.
|
|
30
30
|
11. Grades, grain, blur and vignettes on footage go through `npx hyperframes media-treatment` (`/media-use`), never CSS filters.
|
|
31
31
|
12. A scene file puts its styles, markup and scripts inside `<template>` and styles its root as `#root`. Intended overflow or overlap: `data-layout-allow-overflow`, `data-layout-allow-overlap`.
|
|
32
32
|
|
|
@@ -150,6 +150,7 @@ Studio's Detach audio writes a muted `<video>` and an `<audio>` of the same file
|
|
|
150
150
|
| `media_missing_id`, `media_crossorigin_breaks_preview` | Give every `<audio>` an `id`; drop `crossorigin` |
|
|
151
151
|
| `gsap_timeline_registered_before_async_build` | Register the timeline at the end of the async callback |
|
|
152
152
|
| `standalone_composition_wrapped_in_template` | Only scene files use `<template>` |
|
|
153
|
+
| `subcomposition_linked_style_names_root_id` | A linked sheet cannot style a scene's root by id: use an inline `<style>`, or select a child |
|
|
153
154
|
| `subcomposition_root_styled_by_class` | Style a scene's root as `#root` |
|
|
154
155
|
| `subcomposition_blanks_before_host` | Make the scene's slot span the time it should show |
|
|
155
156
|
| `clip_ends_past_root_duration` | Raise the root's `data-duration` |
|
|
@@ -8,6 +8,8 @@ npx hyperframes beats ./my-video
|
|
|
8
8
|
npx hyperframes beats ./my-video --json
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
`beats` takes the project folder, never a media file. For the beats of one audio or video file, run `npx hyperframes audio <file> --only beats --json`.
|
|
12
|
+
|
|
11
13
|
The project must contain a local music `<audio>` source. Mark it with `data-timeline-role="music"`; an id containing `music`, `bgm`, or `soundtrack` is also recognized. The command decodes that file with ffmpeg, tracks its beats, and writes `beats/<audio-relative-path>.json`.
|
|
12
14
|
|
|
13
15
|
If the track has no steady beat, the command fails and writes nothing. If ffmpeg is missing, run `npx hyperframes doctor`.
|
|
@@ -44,14 +44,14 @@ npx hyperframes check --strict # exit non-zero on warnings too (defaul
|
|
|
44
44
|
One command, one Chrome boot. `check` runs the linter first and skips the browser entirely when lint reports errors. When the browser never ran (lint errors, a linter crash, or a browser launch failure), `browserSkipped` is `true` and the `layout`, `motion` and `contrast` sections are empty, not clean. Otherwise it loads the bundled composition once, wires runtime listeners before navigation, and sweeps one seek grid running every audit per sample:
|
|
45
45
|
|
|
46
46
|
- **Runtime**: JavaScript console errors, unhandled exceptions, failed network requests (media-file `ERR_ABORTED` filtered out), HTTP 4xx/5xx.
|
|
47
|
-
- **Layout**: text extending outside its container or the canvas, text clipped by its own box, held text overlaps and occlusion (with an approximate covered fraction), children escaping clipping containers. Text under a transparent `<video>` (a `remove-background` cutout) is measured per word against the frame's alpha: partial cover is info with the share hidden, a word 80% hidden or two neighbouring words each half hidden is an error, and a frame that cannot be read falls back to opaque with a `video_alpha_unread` note.
|
|
47
|
+
- **Layout**: text extending outside its container or the canvas, text clipped by its own box, held text overlaps and occlusion (with an approximate covered fraction), an opaque element covering the canvas above every other clip for most of the film (`canvas_covered`, naming it), children escaping clipping containers. Text under a transparent `<video>` (a `remove-background` cutout) is measured per word against the frame's alpha: partial cover is info with the share hidden, a word 80% hidden or two neighbouring words each half hidden is an error, and a frame that cannot be read falls back to opaque with a `video_alpha_unread` note.
|
|
48
48
|
- **Motion**: `*.motion.json` sidecar assertions against the same seeked timeline (see below).
|
|
49
49
|
- **Contrast**: WCAG AA on visible text, sampled at 5 grid points. Failures are **errors** and each finding carries the sampled fg/bg colors, measured vs required ratio, and a suggested compliant color in the same palette direction, so most contrast fixes need no screenshot at all.
|
|
50
50
|
- **Craft**: warnings only, even under `--strict` (a film may break one on purpose), measured on an 8 fps sweep of the whole film and skipped under `--range`. Each message names the fix and the reference to read.
|
|
51
51
|
- `line_unread`: a reading-size line (≥ 30 px tall at 1080) on screen under its floor: 0.4 s for 1–2 words, otherwise ¾ of 0.5 s + 0.3 s a word (3 words 1.05 s, 6 words 1.73 s); the film's last line needs 2 s. Edges are re-measured to ~0.01 s. Captions-track text and `data-layout-ignore` are exempt.
|
|
52
52
|
- `dead_stretch`: more than 3 s where the `keepsMoving` classifier sees nothing change. The final 3 s and any time a `data-hold` element is on screen are exempt; it stays quiet when `sweep_static` fires or a whole-composition `keepsMoving` assertion sets the limit.
|
|
53
53
|
- `text_below_floor`: text under 2.6% of the frame's short side (28 px on 1080) held 0.5 s or more, one finding per file listing every element.
|
|
54
|
-
- `first_frame_empty`: frame 0 paints nothing but the background (no text, image, video, canvas or svg); it is the thumbnail on social players.
|
|
54
|
+
- `first_frame_empty`: frame 0 paints nothing but the background (no text, image, video, canvas or svg), or an opaque element covers every other clip and the message names it; it is the thumbnail on social players.
|
|
55
55
|
- `film_silent`: a film over 15 s with no unmuted `<audio>` or audible `<video>`.
|
|
56
56
|
|
|
57
57
|
Every finding carries a selector, the element's `data-*` identity, the composition source file, a bbox, and the sample time: jump straight from the JSON to the HTML you must edit and re-run.
|
|
@@ -120,7 +120,7 @@ hyperframes render -o preview.mp4
|
|
|
120
120
|
# Snapshot for visual QA
|
|
121
121
|
hyperframes snapshot --at "1.0,3.0,5.0,7.0"
|
|
122
122
|
|
|
123
|
-
# Publish to hyperframes.
|
|
123
|
+
# Publish to hyperframes.studio for review
|
|
124
124
|
npx hyperframes publish
|
|
125
125
|
```
|
|
126
126
|
|
|
@@ -152,7 +152,7 @@ npx tsx scripts/generate-registry-items.ts
|
|
|
152
152
|
# 4. Generate catalog docs page
|
|
153
153
|
npx tsx scripts/generate-catalog-pages.ts
|
|
154
154
|
|
|
155
|
-
# 5. Publish to hyperframes.
|
|
155
|
+
# 5. Publish to hyperframes.studio so reviewers can preview
|
|
156
156
|
npx hyperframes publish
|
|
157
157
|
|
|
158
158
|
# 6. Stage everything
|
|
@@ -161,9 +161,9 @@ git add registry/{kind}/{name}/ registry/registry.json docs/catalog/
|
|
|
161
161
|
# 7. Commit
|
|
162
162
|
git commit -m "feat(registry): add {name} — {one sentence}"
|
|
163
163
|
|
|
164
|
-
# 8. Push and open PR with hyperframes.
|
|
164
|
+
# 8. Push and open PR with hyperframes.studio link
|
|
165
165
|
git push origin feat/registry-{name}
|
|
166
|
-
gh pr create --title "feat(registry): {name}" --body "preview: {hyperframes.
|
|
166
|
+
gh pr create --title "feat(registry): {name}" --body "preview: {hyperframes.studio-url}"
|
|
167
167
|
```
|
|
168
168
|
|
|
169
169
|
**If you don't have a GitHub account:** you need one to open a PR. Sign up at https://github.com/signup, then run `gh auth login`.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
eval-report.html
|
|
@@ -40,6 +40,8 @@ hyperframes media-treatment --project . --file index.html \
|
|
|
40
40
|
--grading '{"preset":"warm-daylight","intensity":1}' --apply --json
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
+
On Windows PowerShell, put the payload in a file and pass `--grading grading.json` (or pipe it with `--grading -`); inline JSON loses its quotes there.
|
|
44
|
+
|
|
43
45
|
Use `--dry-run` before writing when scope is uncertain and `--clear` to remove
|
|
44
46
|
the treatment. The low-level persisted result is still normal HTML:
|
|
45
47
|
|
|
@@ -5,6 +5,7 @@ These run on this machine, free, and write into the project.
|
|
|
5
5
|
## Grade and style footage and images
|
|
6
6
|
|
|
7
7
|
- Measure, then correct: `npx hyperframes media-treatment --selector '#hero' --analyze --json`, then `--grading '<json>' --apply`. `--dry-run` previews; `--clear` removes the treatment.
|
|
8
|
+
- On Windows PowerShell, inline JSON loses its quotes: write the JSON to a file and pass its path, `--grading grading.json`, or pipe it with `--grading -`. The same goes for `--variables` and `--vars`.
|
|
8
9
|
- `--file` defaults to `index.html`: for media inside a scene, pass `--file compositions/<scene>.html`.
|
|
9
10
|
- Grain, blur, vignette, presets, palettes: `npx hyperframes media-treatment --capabilities --json`, then `--capability <id>` for one family's controls and ranges.
|
|
10
11
|
- The result is a `data-color-grading` attribute on the media element. It treats the whole element in SDR, so it can't blur one region such as a face.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
run-report.json
|