reelforge 0.10.1 → 0.11.0

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.
@@ -155,6 +155,8 @@ function optsToBody(opts) {
155
155
  out.topic = opts.topic;
156
156
  if (opts.script !== undefined)
157
157
  out.script = opts.script;
158
+ if (opts.title !== undefined)
159
+ out.title = opts.title;
158
160
  if (opts.duration !== undefined)
159
161
  out.duration = opts.duration;
160
162
  if (opts.pace !== undefined)
@@ -344,6 +346,7 @@ export function registerCreate(program) {
344
346
  // --- Content (exactly one of --topic / --script) ---
345
347
  .option("-t, --topic <text>", "video topic; AI writes the script (mode=generate). Prefix with @file to read from disk.")
346
348
  .option("--script <text>", "your own master script text; AI just plans scenes + visuals (mode=fixed). Prefix with @file to read from disk.")
349
+ .option("--title <text>", "hard-override video title; LLM will NOT auto-summarize. Useful for compliance-sensitive content (e.g. financial). Prefix with @file to read from disk. Pass --title '' (empty string) to explicitly suppress title rendering. Omit to keep LLM auto-title.")
347
350
  .option("-d, --duration <sec>", "target video duration in seconds (generate mode only; default 45). LLM aims for ~duration × 5 chars of narration.", (v) => parseInt(v, 10))
348
351
  .option("-p, --pace <pace>", "visual rhythm hint passed to the LLM: slow | normal | fast (default normal). LLM still decides the actual scene count from semantic structure.")
349
352
  // --- Visual ---
@@ -569,6 +572,11 @@ export function registerCreate(program) {
569
572
  if (typeof body.script === "string") {
570
573
  body.script = await resolveTextOrFile(body.script);
571
574
  }
575
+ // Title: resolve @file when present. Empty string is a legit value (=
576
+ // suppress rendering) and must pass through verbatim, never as @file.
577
+ if (typeof body.title === "string" && body.title.startsWith("@")) {
578
+ body.title = await resolveTextOrFile(body.title);
579
+ }
572
580
  // Resolve character ref: local file path → data: URI (RelayX accepts
573
581
  // both https:// and data: in image_urls). Done after layering so a
574
582
  // recipe can carry the ref by path too.
@@ -45,6 +45,7 @@ export function registerPipelines(program) {
45
45
  .helpOption("-h, --help", "show help")
46
46
  .option("-t, --topic <text>", "video topic (mode=generate). Use @file to read from disk.")
47
47
  .option("--script <text>", "your own master script text (mode=fixed). Use @file to read from disk.")
48
+ .option("--title <text>", "hard-override video title; LLM will NOT auto-summarize. Useful for compliance-sensitive content. Use @file to read from disk. Pass --title '' (empty) to explicitly suppress title rendering. Omit to keep LLM auto-title.")
48
49
  .option("-d, --duration <sec>", "target video duration in seconds (generate mode; default 45)", (v) => parseInt(v, 10))
49
50
  .option("-p, --pace <pace>", "visual rhythm hint: slow | normal | fast (default normal)")
50
51
  .option("--motion <preset>", "per-scene image animation: off | lite (default) | max")
@@ -108,10 +109,15 @@ export function registerPipelines(program) {
108
109
  }
109
110
  let topic = opts.topic;
110
111
  let script = opts.script;
112
+ let title = opts.title;
111
113
  if (topic?.startsWith("@"))
112
114
  topic = await fs.readFile(topic.slice(1), "utf-8");
113
115
  if (script?.startsWith("@"))
114
116
  script = await fs.readFile(script.slice(1), "utf-8");
117
+ // Title: resolve @file only when prefix present. Empty "" is a legit value
118
+ // (= suppress title) and must pass through verbatim.
119
+ if (title?.startsWith("@"))
120
+ title = await fs.readFile(title.slice(1), "utf-8");
115
121
  // --frame-template can be a preset key OR a local .html — same heuristic
116
122
  // as 0.7.x. Local path is read and sent as frame_template_html inline.
117
123
  let frame_template;
@@ -134,6 +140,7 @@ export function registerPipelines(program) {
134
140
  await submitAndMaybeWait("/api/v1/pipelines/standard", {
135
141
  topic,
136
142
  script,
143
+ title,
137
144
  duration: opts.duration,
138
145
  pace: opts.pace,
139
146
  motion: opts.motion,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reelforge",
3
- "version": "0.10.1",
3
+ "version": "0.11.0",
4
4
  "description": "CLI for ReelForge Studio — AI video engine. Installs as both `reelforge` and the short alias `rf`. Every REST API exposed as a command, with --help on every level.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",