reframe-video 0.6.19 → 0.6.21
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/.claude-plugin/marketplace.json +14 -0
- package/.claude-plugin/plugin.json +9 -0
- package/dist/bin.js +33 -0
- package/dist/frame.js +1149 -0
- package/guides/directing-guide.md +8 -2
- package/package.json +4 -2
- package/skills/reframe/SKILL.md +101 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "reframe",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "Kiyeon Jeon",
|
|
5
|
+
"url": "https://github.com/kiyeonjeon21"
|
|
6
|
+
},
|
|
7
|
+
"plugins": [
|
|
8
|
+
{
|
|
9
|
+
"name": "reframe",
|
|
10
|
+
"source": "./",
|
|
11
|
+
"description": "Motion-graphics videos as addressable data — generate, tweak, regenerate without losing human edits."
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "reframe",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Create and iterate motion-graphics videos as addressable data: deterministic mp4 renders, human edits that survive AI regeneration, label-anchored audio, data-driven batch rendering.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Kiyeon Jeon",
|
|
7
|
+
"url": "https://github.com/kiyeonjeon21"
|
|
8
|
+
}
|
|
9
|
+
}
|
package/dist/bin.js
CHANGED
|
@@ -2799,6 +2799,7 @@ var RENDER_CLI = PACKAGED ? join9(ROOT2, "dist", "cli.js") : join9(ROOT2, "packa
|
|
|
2799
2799
|
var LABELS = PACKAGED ? join9(ROOT2, "dist", "labels.js") : join9(ROOT2, "packages", "render-cli", "src", "labels.ts");
|
|
2800
2800
|
var COMPILE = PACKAGED ? join9(ROOT2, "dist", "compile.js") : join9(ROOT2, "packages", "render-cli", "src", "compile.ts");
|
|
2801
2801
|
var DIFF = PACKAGED ? join9(ROOT2, "dist", "diff.js") : join9(ROOT2, "packages", "render-cli", "src", "diff.ts");
|
|
2802
|
+
var FRAME = PACKAGED ? join9(ROOT2, "dist", "frame.js") : join9(ROOT2, "packages", "render-cli", "src", "frame.ts");
|
|
2802
2803
|
var PLAYER = PACKAGED ? join9(ROOT2, "dist", "player.js") : join9(ROOT2, "packages", "render-cli", "src", "player.ts");
|
|
2803
2804
|
var ANALYZE = PACKAGED ? join9(ROOT2, "dist", "analyze.js") : join9(ROOT2, "benchmark", "harness", "motion", "analyze.ts");
|
|
2804
2805
|
var TRACE = PACKAGED ? join9(ROOT2, "dist", "trace-cli.js") : join9(ROOT2, "benchmark", "harness", "motion", "trace-cli.ts");
|
|
@@ -2818,6 +2819,8 @@ usage:
|
|
|
2818
2819
|
${CMD} labels <scene.ts|.json> print the event clock (label \u2192 exact seconds; for sound design / timing)
|
|
2819
2820
|
${CMD} compile <scene.ts|.json> [-o out.json] [--stdin] [--code "<src>"] [--json]
|
|
2820
2821
|
bundle + validate a scene to SceneIR JSON, no render (fast; no ffmpeg/chromium)
|
|
2822
|
+
${CMD} frame <scene.ts|.json> [--t <sec>] [-o out.png] render ONE frame at time t to a PNG (no mp4; for a render-and-look loop)
|
|
2823
|
+
${CMD} skill [--path] print the authoring skill (SKILL.md) for an agent; --path prints the plugin dir to load
|
|
2821
2824
|
${CMD} motion <mp4|framesDir> motion-profile a rendered clip
|
|
2822
2825
|
${CMD} trace <ref.mp4> [--apply scene.ts] extract a video's motion structure \u2192 MotionSketch / timeline
|
|
2823
2826
|
${CMD} diff <ref-image> [<scene.ts>] [--t S] [--mode side|blend|diff|grid] compare/measure a render against a reference image
|
|
@@ -2982,6 +2985,26 @@ ${USAGE}`);
|
|
|
2982
2985
|
await (PACKAGED ? run2(process.execPath, [COMPILE, ...passed]) : run2("npx", ["tsx", COMPILE, ...passed]))
|
|
2983
2986
|
);
|
|
2984
2987
|
}
|
|
2988
|
+
case "frame": {
|
|
2989
|
+
const input = rest[0];
|
|
2990
|
+
if (!input || input.startsWith("-")) fail(`frame needs a scene file
|
|
2991
|
+
|
|
2992
|
+
${USAGE}`);
|
|
2993
|
+
const inputPath = userPath(input);
|
|
2994
|
+
if (!existsSync6(inputPath)) fail(`no such file: ${inputPath}`);
|
|
2995
|
+
const args = rest.slice(1);
|
|
2996
|
+
const outBase = PACKAGED ? join9(USER_CWD, "out") : join9(ROOT2, "out");
|
|
2997
|
+
const stem = `${basename(input).replace(/\.[^.]+$/, "")}.png`;
|
|
2998
|
+
let outArgs = args;
|
|
2999
|
+
if (args.indexOf("-o") === -1) {
|
|
3000
|
+
await mkdir4(outBase, { recursive: true });
|
|
3001
|
+
outArgs = [...args, "-o", join9(outBase, stem)];
|
|
3002
|
+
}
|
|
3003
|
+
outArgs = outArgs.map((a, i) => outArgs[i - 1] === "-o" ? userPath(a) : a);
|
|
3004
|
+
process.exit(
|
|
3005
|
+
await (PACKAGED ? run2(process.execPath, [FRAME, inputPath, ...outArgs]) : run2("npx", ["tsx", FRAME, inputPath, ...outArgs]))
|
|
3006
|
+
);
|
|
3007
|
+
}
|
|
2985
3008
|
case "player": {
|
|
2986
3009
|
const input = rest[0];
|
|
2987
3010
|
if (!input || input.startsWith("-")) fail(`player needs a scene file
|
|
@@ -3170,6 +3193,16 @@ ${results.length - failed} rendered (${orphaned} with orphans), ${failed} failed
|
|
|
3170
3193
|
process.stdout.write(await readFile7(file, "utf8"));
|
|
3171
3194
|
return;
|
|
3172
3195
|
}
|
|
3196
|
+
case "skill": {
|
|
3197
|
+
if (rest.includes("--path")) {
|
|
3198
|
+
process.stdout.write(`${ROOT2}
|
|
3199
|
+
`);
|
|
3200
|
+
return;
|
|
3201
|
+
}
|
|
3202
|
+
const { readFile: readFile7 } = await import("node:fs/promises");
|
|
3203
|
+
process.stdout.write(await readFile7(join9(ROOT2, "skills", "reframe", "SKILL.md"), "utf8"));
|
|
3204
|
+
return;
|
|
3205
|
+
}
|
|
3173
3206
|
case "demo":
|
|
3174
3207
|
if (PACKAGED) {
|
|
3175
3208
|
fail(
|