mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-08-31 10:46:57 +00:00
`registry_item_added` fires when a catalog block is installed and `render_complete` fires when a video is produced, but nothing joined them, so "did this video use the catalog?" had no answer. `hyperframes add` now records each installed item in `hyperframes.json` (installed files are plain composition HTML with no provenance marker, so this manifest is the only record that a file came from the registry), and `render_complete` reports both the items the project installed and the blocks the rendered composition actually reaches. An item installed and then never mounted was tried and dropped, which no add-time event can express. The scan answering "which sub-compositions does this file mount" now has one owner, `collectSubCompositionSrcs` in `@hyperframes/parsers`, shared with lint's `lintMissingOrEmptySubComposition`. It holds two invariants that were previously restated per call site and got re-derived wrongly: it is a text scan rather than a DOM query, because `<template>` content is inert and every sub-composition except the render entry is wrapped in one; and references resolve root-relative at every nesting level, matching `parseSubCompositions`. It walks tag by tag rather than running open-ended spans across the whole file, so a malformed composition cannot stall the render plan. Also: `registryItems` is declared in the config schema, which closes with `additionalProperties: false`, with an ajv-backed test pinning every key the CLI writes; counts are never truncated by the name cap, and the reported used blocks stay a subset of the reported installed ones, with `registry_items_truncated` marking a windowed list; and an unreadable manifest reports itself rather than posing as a project that never used the catalog.
85 lines
3.4 KiB
JSON
85 lines
3.4 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://hyperframes.heygen.com/schema/hyperframes.json",
|
|
"title": "Hyperframes Project Config",
|
|
"description": "Per-project configuration for a Hyperframes project (hyperframes.json). Tells `hyperframes add` which registry to pull items from and where to drop them in the project tree. Created by `hyperframes init`; users may edit it to point at custom registries or reshape their project layout.",
|
|
"type": "object",
|
|
"required": ["registry", "paths"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"$schema": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"description": "JSON Schema URL — https://hyperframes.heygen.com/schema/hyperframes.json."
|
|
},
|
|
"registry": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"minLength": 1,
|
|
"description": "Base URL of the registry to pull items from. Point at the official Hyperframes registry or a custom one."
|
|
},
|
|
"paths": {
|
|
"type": "object",
|
|
"description": "Target paths for each item type, relative to the project root.",
|
|
"required": ["blocks", "components", "assets"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"blocks": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"description": "Where `hyperframes:block` items land. Defaults to `compositions`."
|
|
},
|
|
"components": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"description": "Where `hyperframes:component` items land. Defaults to `compositions/components`."
|
|
},
|
|
"assets": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"description": "Where asset files (images, fonts, videos) land. Defaults to `assets`."
|
|
}
|
|
}
|
|
},
|
|
"media": {
|
|
"type": "object",
|
|
"description": "Media handling options.",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"autoProxy": {
|
|
"type": "boolean",
|
|
"description": "Automatically create H.264 proxies for browser-hostile video codecs on supported preview surfaces. Defaults to true."
|
|
}
|
|
}
|
|
},
|
|
"authoringSkill": {
|
|
"type": "string",
|
|
"pattern": "^[a-z0-9][a-z0-9-]{0,63}$",
|
|
"description": "Owning authoring-workflow skill slug (e.g. product-launch-video). Set by `hyperframes init --skill` or seeded from the first `hyperframes render --skill`; every render of this project is then attributed to it on anonymous telemetry, without re-passing the flag."
|
|
},
|
|
"registryItems": {
|
|
"type": "array",
|
|
"description": "Catalog items installed by `hyperframes add`, in install order. Installed files are plain composition HTML with no provenance marker, so this is the only record that a file came from the registry; a render reads it back to report which catalog items the finished video actually used. Append-only, deduped by name.",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["name", "type", "target"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Registry item name, e.g. data-chart."
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"description": "Registry item type, e.g. hyperframes:block."
|
|
},
|
|
"target": {
|
|
"type": "string",
|
|
"description": "Primary installed file, relative to the project root."
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|