@remixmate/cli 0.13.0 → 0.13.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/dist/manifest.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"version": "0.13.
|
|
4
|
-
"generatedAt": "2026-10-
|
|
3
|
+
"version": "0.13.1",
|
|
4
|
+
"generatedAt": "2026-10-25T04:48:35.989Z",
|
|
5
5
|
"skills": [
|
|
6
6
|
{
|
|
7
7
|
"id": "doc-parse",
|
|
@@ -602,6 +602,15 @@
|
|
|
602
602
|
"type": "string",
|
|
603
603
|
"description": "Media fill mode for templates declaring capabilities.mediaBinding.options.fit; one of that option's enum in the template's customPayloadSchema (its descriptions explain each value). Beats the preset's own fit. **Must** pass when the user picked it: `显示方式: <名称>(<id>)` → pass `<id>`; `auto` keeps the template / preset default."
|
|
604
604
|
},
|
|
605
|
+
"narration": {
|
|
606
|
+
"type": "string",
|
|
607
|
+
"enum": [
|
|
608
|
+
"auto",
|
|
609
|
+
"on",
|
|
610
|
+
"off"
|
|
611
|
+
],
|
|
612
|
+
"description": "Narration on / off, overriding the template's needsNarration (auto = the template decides). Templates where narration is optional (image sequences, galton-board) default to none — **must** pass `on` when the replicate card says `旁白: <名称>(narrated)`, otherwise the narration you write is dropped without an error and the video comes back silent. `off` drops narration from a narrated template."
|
|
613
|
+
},
|
|
605
614
|
"background_asset": {
|
|
606
615
|
"type": "string",
|
|
607
616
|
"description": "URL of the user's background image or video (the replicate card's 背景素材 / 背景图片 asset line → its URL). Added as an existing asset and referenced from every scene's customPayload.background (assetRef for an image, videoAssetRef for a video; .mp4/.mov/.webm/.m4v count as video); the background preset becomes image / video, so background_preset can be omitted. **Must** pass when the user gave a background file — without it a preset of image / video renders the template's plain default. Requires template_id; rejected when the template has no background of that kind."
|
|
@@ -737,6 +746,7 @@
|
|
|
737
746
|
"background_preset",
|
|
738
747
|
"sequence_preset",
|
|
739
748
|
"sequence_fit",
|
|
749
|
+
"narration",
|
|
740
750
|
"background_asset",
|
|
741
751
|
"payload",
|
|
742
752
|
"ending_payload",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remixmate/cli",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.1",
|
|
4
4
|
"description": "AI media generation skills for Claude Code / Codex — 12 skills covering image, video, voice, digital human, web screenshot, web recording, script, template registry, rendering, Jianying export, and video deconstruction.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -484,6 +484,7 @@ python3 <SkillDir>/scripts/gen_script.py \
|
|
|
484
484
|
| `--background-preset` | Scene background preset, one of the template's `customPayloadSchema.background.preset` values. Written to every scene's `customPayload.background.preset` (other keys of the template's default background are kept). Pass it whenever the user picked a background, e.g. `背景样式: <名称>(<id>)` → `<id>`. `image` / `video` need the user's file: pass `--background-asset` (which sets the preset itself). Requires `--template-id`; unsupported values are rejected. | template default |
|
|
485
485
|
| `--sequence-preset` | Style preset for templates declaring `capabilities.mediaBinding.options.preset`; one of that option's enum in the template's `customPayloadSchema` (`none` keeps the template defaults). Written next to the media list; the preset sets transitions, motion, text layout and pacing, and the scene duration follows. **Must** pass when the user picked a style preset on the replicate card (pass the id in parentheses, e.g. `风格预设: <名称>(<id>)` → `<id>`); otherwise the choice is silently dropped. Rejected on templates without that option. |
|
|
486
486
|
| `--sequence-fit` | Fill mode for templates declaring `capabilities.mediaBinding.options.fit`; one of that option's enum (`auto` keeps the template / preset default). Beats the preset's own fit. **Must** pass when the user picked it on the replicate card (`显示方式: <名称>(<id>)` → `<id>`). |
|
|
487
|
+
| `--narration` | `auto` (the template's `capabilities.needsNarration` decides), `on` or `off`. Templates where narration is optional default to none; **must** pass `on` when the user picked narration on the replicate card (`旁白: <名称>(narrated)`), otherwise the narration written later is dropped without an error. `on` adds the narration slot, a `gen-voice` asset and subtitles; on `fit-images` templates that declare `customPayload.minDurationSec` it also writes the media's natural length there, so a short narration does not compress the media (a longer one stretches the scene). |
|
|
487
488
|
| `--background-asset` | URL of the user's background image or video (`.mp4/.mov/.webm/.m4v` → video). Added as existing asset `asset-background`; every scene's `customPayload.background` gets `preset: image` + `assetRef`, or `preset: video` + `videoAssetRef`. Conflicts with a different `--background-preset`; rejected when the template's background enum lacks that kind. | none |
|
|
488
489
|
| `--payload KEY=VALUE` | Template-specific card choice, repeatable. `KEY` is a dotted path in `customPayloadSchema` (or `capabilities.frameLevelKeys`), e.g. `<field>=<value>`, `<object>.<field>=<value>`. Value is converted to the declared type (true/false, numbers) and checked against enum / range; undeclared keys are rejected. Written to every scene with sibling keys kept, applied before fit-caption duration estimation. | template default |
|
|
489
490
|
| `--ending-payload KEY=VALUE` | Same as `--payload`, but written only to the ending scene, e.g. `<object>.<field>=<closing line>`. On countdown templates it also appends an ending scene after #1 (it carries the #1 index; fill its narration and the item field `capabilities.countdown.itemProp` names). Errors when the script has no ending scene. | none |
|
|
@@ -582,6 +582,10 @@ def _template_primary_visual_type(template_config: dict | None) -> str:
|
|
|
582
582
|
return "none"
|
|
583
583
|
|
|
584
584
|
|
|
585
|
+
|
|
586
|
+
NARRATION_MODES = ("auto", "on", "off")
|
|
587
|
+
|
|
588
|
+
|
|
585
589
|
def _template_needs_narration(template_config: dict | None) -> bool:
|
|
586
590
|
|
|
587
591
|
|
|
@@ -1382,10 +1386,6 @@ def _build_carousel_caption_dsl(
|
|
|
1382
1386
|
_write_payload(custom_payload, payload_writes or [])
|
|
1383
1387
|
|
|
1384
1388
|
|
|
1385
|
-
narration_text = _localize_label(output_language, "narration_opening",
|
|
1386
|
-
label="", topic=_clip(topic, _PLACEHOLDER_TOPIC_CHARS), duration=duration)
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
1389
|
|
|
1390
1390
|
|
|
1391
1391
|
|
|
@@ -1403,6 +1403,33 @@ def _build_carousel_caption_dsl(
|
|
|
1403
1403
|
)
|
|
1404
1404
|
|
|
1405
1405
|
|
|
1406
|
+
|
|
1407
|
+
|
|
1408
|
+
narration_text = _localize_label(
|
|
1409
|
+
output_language, "narration_opening", label="", topic=_clip(topic, _PLACEHOLDER_TOPIC_CHARS),
|
|
1410
|
+
duration=effective_duration,
|
|
1411
|
+
budget=_budget_suffix(effective_duration, output_language, narration_speed, None),
|
|
1412
|
+
)
|
|
1413
|
+
narration_locks: list[str] = []
|
|
1414
|
+
if narration_enabled and duration_strategy == "fit-images" and _schema_at(template_config, ["minDurationSec"]):
|
|
1415
|
+
|
|
1416
|
+
|
|
1417
|
+
|
|
1418
|
+
custom_payload["minDurationSec"] = effective_duration
|
|
1419
|
+
narration_locks.append("customPayload.minDurationSec")
|
|
1420
|
+
|
|
1421
|
+
|
|
1422
|
+
|
|
1423
|
+
|
|
1424
|
+
pacing_path = container_parts + ["pacing"]
|
|
1425
|
+
pacing_schema = _schema_at(template_config, pacing_path)
|
|
1426
|
+
explicit_pacing = any(parts == pacing_path for parts, _ in (payload_writes or []))
|
|
1427
|
+
if (container_parts and not video_seconds and "fit-scene" in (pacing_schema.get("enum") or [])
|
|
1428
|
+
and not explicit_pacing):
|
|
1429
|
+
container["pacing"] = "fit-scene"
|
|
1430
|
+
narration_locks.append("customPayload." + ".".join(container_parts + ["pacing"]))
|
|
1431
|
+
|
|
1432
|
+
|
|
1406
1433
|
text_layers = [
|
|
1407
1434
|
{"role": "headline", "content": headline, "animation": "slide-up"},
|
|
1408
1435
|
]
|
|
@@ -1459,6 +1486,8 @@ def _build_carousel_caption_dsl(
|
|
|
1459
1486
|
"scenes": [scene],
|
|
1460
1487
|
"transitions": {"default": "fade", "duration": 0.5},
|
|
1461
1488
|
}
|
|
1489
|
+
for path in narration_locks:
|
|
1490
|
+
_lock_scene_path(dsl, path)
|
|
1462
1491
|
|
|
1463
1492
|
return dsl
|
|
1464
1493
|
|
|
@@ -2430,6 +2459,7 @@ def build_dsl(
|
|
|
2430
2459
|
sequence_fit: str | None = None,
|
|
2431
2460
|
payload_writes: PayloadWrites | None = None,
|
|
2432
2461
|
countdown_ending: bool = False,
|
|
2462
|
+
narration: str = "auto",
|
|
2433
2463
|
) -> dict:
|
|
2434
2464
|
|
|
2435
2465
|
|
|
@@ -2461,6 +2491,12 @@ def build_dsl(
|
|
|
2461
2491
|
|
|
2462
2492
|
template_config = _load_template_config(template_id) if template_id else None
|
|
2463
2493
|
contract = _resolve_contract(template_config)
|
|
2494
|
+
|
|
2495
|
+
|
|
2496
|
+
if narration not in NARRATION_MODES:
|
|
2497
|
+
raise ValueError(f"--narration must be one of {', '.join(NARRATION_MODES)}, got {narration!r}")
|
|
2498
|
+
if narration != "auto":
|
|
2499
|
+
contract["needs_narration"] = narration == "on"
|
|
2464
2500
|
countdown = contract["countdown"]
|
|
2465
2501
|
if countdown is None and item_count is not None:
|
|
2466
2502
|
raise ValueError(
|
|
@@ -2751,6 +2787,13 @@ Examples:
|
|
|
2751
2787
|
"the template defaults. When the user picked a style preset in the replicate card "
|
|
2752
2788
|
"(`<名称>(<id>)`), pass that id.",
|
|
2753
2789
|
)
|
|
2790
|
+
parser.add_argument(
|
|
2791
|
+
"--narration", default="auto", choices=NARRATION_MODES,
|
|
2792
|
+
help="Narration on / off, overriding the template's capabilities.needsNarration (auto = the template "
|
|
2793
|
+
"decides). Templates where narration is optional default to none; pass `on` when the user picked "
|
|
2794
|
+
"narration in the replicate card (`旁白: <名称>(narrated)`), so the skeleton gets narration slots, "
|
|
2795
|
+
"a gen-voice asset and subtitles. `off` drops narration from a narrated template.",
|
|
2796
|
+
)
|
|
2754
2797
|
parser.add_argument(
|
|
2755
2798
|
"--sequence-fit", default=None,
|
|
2756
2799
|
help="Media fill mode for templates declaring capabilities.mediaBinding.options.fit (one of that "
|
|
@@ -3084,6 +3127,7 @@ def main():
|
|
|
3084
3127
|
sequence_fit=args.sequence_fit,
|
|
3085
3128
|
payload_writes=payload_writes,
|
|
3086
3129
|
countdown_ending=bool(args.ending_payload),
|
|
3130
|
+
narration=args.narration,
|
|
3087
3131
|
)
|
|
3088
3132
|
except ValueError as exc:
|
|
3089
3133
|
|
|
@@ -64,6 +64,11 @@
|
|
|
64
64
|
"type": "string",
|
|
65
65
|
"description": "Media fill mode for templates declaring capabilities.mediaBinding.options.fit; one of that option's enum in the template's customPayloadSchema (its descriptions explain each value). Beats the preset's own fit. **Must** pass when the user picked it: `显示方式: <名称>(<id>)` → pass `<id>`; `auto` keeps the template / preset default."
|
|
66
66
|
},
|
|
67
|
+
"narration": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"enum": ["auto", "on", "off"],
|
|
70
|
+
"description": "Narration on / off, overriding the template's needsNarration (auto = the template decides). Templates where narration is optional (image sequences, galton-board) default to none — **must** pass `on` when the replicate card says `旁白: <名称>(narrated)`, otherwise the narration you write is dropped without an error and the video comes back silent. `off` drops narration from a narrated template."
|
|
71
|
+
},
|
|
67
72
|
"background_asset": {
|
|
68
73
|
"type": "string",
|
|
69
74
|
"description": "URL of the user's background image or video (the replicate card's 背景素材 / 背景图片 asset line → its URL). Added as an existing asset and referenced from every scene's customPayload.background (assetRef for an image, videoAssetRef for a video; .mp4/.mov/.webm/.m4v count as video); the background preset becomes image / video, so background_preset can be omitted. **Must** pass when the user gave a background file — without it a preset of image / video renders the template's plain default. Requires template_id; rejected when the template has no background of that kind."
|
|
@@ -199,6 +204,7 @@
|
|
|
199
204
|
"background_preset",
|
|
200
205
|
"sequence_preset",
|
|
201
206
|
"sequence_fit",
|
|
207
|
+
"narration",
|
|
202
208
|
"background_asset",
|
|
203
209
|
"payload",
|
|
204
210
|
"ending_payload",
|