@remixmate/cli 0.12.9 → 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/README.md +7 -2
- package/README.zh-CN.md +1 -1
- package/dist/manifest.json +20 -10
- package/dist/template/preview.js +7 -7
- package/dist/template/publish.js +8 -8
- package/dist/template/scene-props.js +1 -0
- package/dist/template/still-cases.js +1 -1
- package/package.json +1 -1
- package/skills/export-jianying/scripts/gen_jianying_draft.py +38 -33
- package/skills/export-jianying/version.json +1 -1
- package/skills/gen-script/SKILL.md +15 -14
- package/skills/gen-script/scripts/gen_script.py +855 -568
- package/skills/gen-script/skill.json +14 -8
- package/skills/gen-script/version.json +1 -1
- package/skills/render-video/scripts/_video_probe.py +0 -1
- package/skills/render-video/scripts/remote_renderer_client.py +9 -7
- package/skills/render-video/scripts/render_video.py +553 -391
- package/skills/render-video/version.json +1 -1
- package/skills/template-registry/SKILL.md +1 -1
- package/skills/template-registry/scripts/match_template.py +2 -2
- package/skills/template-registry/scripts/payload_hydrator.py +9 -1
- package/skills/template-registry/scripts/render_job_client.py +4 -0
- package/skills/template-registry/version.json +1 -1
- package/skills/template-registry/video_dsl/runtime/dsl_validator.py +50 -24
- package/skills/template-registry/video_dsl/schema/render-plan-v1alpha1.json +7 -1
- package/skills/video-parser/scripts/analyze_video.py +2 -0
- package/skills/video-parser/version.json +1 -1
|
@@ -54,15 +54,20 @@
|
|
|
54
54
|
},
|
|
55
55
|
"background_preset": {
|
|
56
56
|
"type": "string",
|
|
57
|
-
"description": "Scene background preset, one of the template's customPayloadSchema.background.preset values. Written to every scene's customPayload.background.preset. **Must** pass when the user picked a background: the replicate card shows `背景样式:
|
|
57
|
+
"description": "Scene background preset, one of the template's customPayloadSchema.background.preset values. Written to every scene's customPayload.background.preset. **Must** pass when the user picked a background: the replicate card shows `背景样式: <名称>(<id>)` → pass `<id>`. Without it the scene keeps the template default. Requires template_id; unsupported values are rejected. `image` / `video` need the user's file: pass it as background_asset (which also sets the preset)."
|
|
58
58
|
},
|
|
59
59
|
"sequence_preset": {
|
|
60
60
|
"type": "string",
|
|
61
|
-
"description": "
|
|
61
|
+
"description": "Style preset for templates declaring capabilities.mediaBinding.options.preset; one of that option's enum in the template's customPayloadSchema. Written next to the template's 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: the replicate card shows `风格预设: <名称>(<id>)` → pass `<id>`; `none` keeps the template defaults. Without it the choice is silently dropped. Rejected on templates without that option; unsupported values are rejected."
|
|
62
62
|
},
|
|
63
63
|
"sequence_fit": {
|
|
64
64
|
"type": "string",
|
|
65
|
-
"description": "
|
|
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
|
+
},
|
|
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."
|
|
66
71
|
},
|
|
67
72
|
"background_asset": {
|
|
68
73
|
"type": "string",
|
|
@@ -73,7 +78,7 @@
|
|
|
73
78
|
"items": {
|
|
74
79
|
"type": "string"
|
|
75
80
|
},
|
|
76
|
-
"description": "Template-specific card choices as `KEY=VALUE`, written to every scene's customPayload and locked so the dsl_json you save cannot overwrite them. KEY is a dotted path into the template's customPayloadSchema (e.g.
|
|
81
|
+
"description": "Template-specific card choices as `KEY=VALUE`, written to every scene's customPayload and locked so the dsl_json you save cannot overwrite them. KEY is a dotted path into the template's customPayloadSchema (e.g. `<field>=<value>`, `<object>.<field>=<value>`); VALUE is the id inside the card line's parentheses, or the text verbatim for free-text fields. Booleans take true/false, numbers are range-checked, enums are checked — an undeclared key or value is rejected with the allowed list. **Must** pass every card line that the system prompt maps to a payload key; without it the choice is silently dropped. Requires template_id."
|
|
77
82
|
},
|
|
78
83
|
"motion": {
|
|
79
84
|
"type": "string",
|
|
@@ -92,11 +97,11 @@
|
|
|
92
97
|
"items": {
|
|
93
98
|
"type": "string"
|
|
94
99
|
},
|
|
95
|
-
"description": "Like payload, but `KEY=VALUE` is written only to the ending scene and locked there (e.g.
|
|
100
|
+
"description": "Like payload, but `KEY=VALUE` is written only to the ending scene and locked there (e.g. the replicate card's 片尾引导 line → `<object>.<field>=<closing line>`, key as the card shows it). On countdown templates (Top-N lists) it also appends the ending scene after #1 — fill that scene's narration (a closing line) and its item field with the #1 entry. Without it a countdown ends on the #1 card. Requires template_id."
|
|
96
101
|
},
|
|
97
102
|
"avatar_id": {
|
|
98
103
|
"type": "string",
|
|
99
|
-
"description": "Digital-human avatar id (`dh_xxx`, the replicate card's 数字人主讲 / 数字人讲师 line) for templates declaring capabilities.digitalHuman
|
|
104
|
+
"description": "Digital-human avatar id (`dh_xxx`, the replicate card's 数字人主讲 / 数字人讲师 line) for templates declaring capabilities.digitalHuman. Adds one gen-digital-human asset referenced by every scene's visuals.avatar.assetRef: one continuous presenter whose lips follow the narration. Placement stays the template default; adjust with payload `digitalHuman.<field>=…`. Copy the id verbatim, never invent one. Costs digital-human credits, so pass it only when the user picked an avatar. Requires template_id."
|
|
100
105
|
},
|
|
101
106
|
"font_id": {
|
|
102
107
|
"type": "string",
|
|
@@ -143,7 +148,7 @@
|
|
|
143
148
|
"items": {
|
|
144
149
|
"type": "string"
|
|
145
150
|
},
|
|
146
|
-
"description": "Media URLs for the template's image/video
|
|
151
|
+
"description": "Media URLs for the template's image/video list. When provided together with a template_id whose capabilities.payloadStyle=carousel-caption, these URLs are written as existing assets into the media list the template declares in capabilities.mediaBinding.itemsPath — NO AI image generation is triggered. **Must** pass when the user explicitly provides image/video URLs for such a template. Each element is a full URL string. Video URLs (.mp4/.mov/.webm) are accepted too; when the template declares mediaBinding.videoDurationKey gen_script probes each clip's real length and writes it, and an unreadable video is rejected."
|
|
147
152
|
},
|
|
148
153
|
"scene_images": {
|
|
149
154
|
"type": "array",
|
|
@@ -157,7 +162,7 @@
|
|
|
157
162
|
"items": {
|
|
158
163
|
"type": "string"
|
|
159
164
|
},
|
|
160
|
-
"description": "On-screen caption lines for
|
|
165
|
+
"description": "On-screen caption lines for carousel-caption templates; capabilities.mediaBinding.captions says where they go — one text block, or one caption per media item in order (at most one line per item). A replicate asset line's `(… desc: <text>)` suffix is the user's caption for that image: pass it here in the same order (use an empty string for images without one). Otherwise each element is one line. Line-count limits and whether **emphasis** is parsed are declared by the template — read its llmHint, which gen_script prints in full on stderr. **Must** pass when the user explicitly provides bullet-point text / bottom copy. **Also must pass — written by you — when the user did NOT provide any copy but the template is typewriter-driven** (capabilities.durationStrategy=fit-caption): such templates have no narration, so these lines are both the video's content and the thing that decides its duration. Draft them from the material you researched (repo README, page screenshots, the topic). Leaving this empty for a fit-caption template is rejected: nothing auto-generates caption text, and an empty caption renders a titled carousel with no words at all."
|
|
161
166
|
},
|
|
162
167
|
"stub_image_url": {
|
|
163
168
|
"type": "string",
|
|
@@ -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",
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"skillName": "gen-script",
|
|
3
3
|
"repoName": "agent-skill-media-maker",
|
|
4
4
|
"skillId": "474",
|
|
5
|
-
"version": "
|
|
5
|
+
"version": "V23",
|
|
6
6
|
"skillDescription": "Video-script generation skill. Turns a user-supplied topic into a structured Video DSL (JSON) that describes the full video — scene structure, asset requirements, and narrative flow.\n\nUse this skill as soon as the user mentions any of these intents:\n- Write a video script, generate a video script, plan a video, write storyboards\n- Create a short video, plan video content, generate a Video DSL\n- Turn a topic into a video structure / video content plan\n\nEven when the user does not say \"generate the DSL\", use this skill whenever they want to turn a topic into a structured video plan.\n\n⚠️ Stop-and-confirm gate: after this skill returns a DSL, show the full script and wait for the user's explicit confirmation. Never call `prepare_video_assets` in the same turn."
|
|
7
7
|
}
|
|
@@ -248,6 +248,15 @@ def poll_render(
|
|
|
248
248
|
timeout=request_timeout,
|
|
249
249
|
)
|
|
250
250
|
except (urllib.error.URLError, OSError, ConnectionError) as exc:
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
if isinstance(exc, urllib.error.HTTPError) and exc.code < 500:
|
|
254
|
+
body = ""
|
|
255
|
+
try:
|
|
256
|
+
body = exc.read().decode("utf-8")
|
|
257
|
+
except Exception:
|
|
258
|
+
pass
|
|
259
|
+
raise RemoteRenderError(f"HTTP {exc.code} {status_path}: {body[:200]}") from exc
|
|
251
260
|
consecutive_errors += 1
|
|
252
261
|
print(
|
|
253
262
|
f" ⚠️ polling network error ({consecutive_errors}/{max_consecutive_errors}): {exc}",
|
|
@@ -260,13 +269,6 @@ def poll_render(
|
|
|
260
269
|
) from exc
|
|
261
270
|
time.sleep(interval)
|
|
262
271
|
continue
|
|
263
|
-
except urllib.error.HTTPError as exc:
|
|
264
|
-
body = ""
|
|
265
|
-
try:
|
|
266
|
-
body = exc.read().decode("utf-8")
|
|
267
|
-
except Exception:
|
|
268
|
-
pass
|
|
269
|
-
raise RemoteRenderError(f"HTTP {exc.code} {status_path}: {body[:200]}") from exc
|
|
270
272
|
|
|
271
273
|
consecutive_errors = 0
|
|
272
274
|
|