@remixmate/cli 0.9.5 → 0.9.6

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "0.9.5",
4
- "generatedAt": "2026-06-13T08:35:23.571Z",
3
+ "version": "0.9.6",
4
+ "generatedAt": "2026-06-15T14:23:52.383Z",
5
5
  "skills": [
6
6
  {
7
7
  "id": "export-jianying",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remixmate/cli",
3
- "version": "0.9.5",
3
+ "version": "0.9.6",
4
4
  "description": "AI media generation skills for Claude Code / Codex — 11 skills covering image, video, voice, digital human, web capture, script, template registry, rendering, Jianying export, and video deconstruction.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -126,6 +126,37 @@ The agent should show the following in clear Markdown:
126
126
  > Reply "continue" to proceed to template matching, or tell me what to change.
127
127
  ```
128
128
 
129
+ ## Agent behavior: user-supplied media for carousel/image-driven templates (`--carousel-items` / `--caption-lines`)
130
+
131
+ Some templates are **media-driven, not prompt-driven**: their on-screen content comes entirely from media URLs the user already has, and the skill does **not** generate any image. These are the templates whose `capabilities.payloadStyle` is `carousel-caption` (e.g. `adaptive-image-video`, `spotlight-card`).
132
+
133
+ For these templates the picture comes from `customPayload.carousel.items`, which is filled **only** from the `--carousel-items` flag. If the user gives you images but you do not pass `--carousel-items`, the carousel is empty and the result is a **black, 2-second clip** (with `durationStrategy: fit-caption`, an empty carousel + empty caption degrades to the 1s headline-intro + 1s tail minimum). `gen_script.py` now hard-fails in this case instead of producing the degenerate video.
134
+
135
+ ### Mandatory behavior
136
+
137
+ When the user selects a `carousel-caption` template (or any template whose `assetRequirements` is image/video-only and whose `payloadStyle` is `carousel-caption`):
138
+
139
+ 1. **Extract every media URL the user provided** (image or video links in the prompt) and pass each one as a separate `--carousel-items <url>` flag — preserve the user's order, and pass the URLs **verbatim** (do not rewrite host/path/query).
140
+ 2. If the user wants on-screen text, pass each caption line as `--caption-lines '<text>'`. For purely visual templates like `adaptive-image-video` (no text, `needsNarration: false`), captions are optional.
141
+ 3. **Never call gen_script for a `carousel-caption` template without `--carousel-items`.** If the user picked such a template but provided no media, ask them for the image/video URLs first — do not generate an empty carousel.
142
+ 4. Do **not** route these user-provided images through `gen-image`; they are existing assets and go straight into the carousel.
143
+
144
+ ### Command example
145
+
146
+ User: "用模版 adaptive-image-video 生成视频,图片链接为:https://cdn.example.com/a.jpg,https://cdn.example.com/b.jpg,https://cdn.example.com/c.jpg"
147
+
148
+ ```bash
149
+ python3 <SkillDir>/scripts/gen_script.py \
150
+ --topic "图片轮播视频" \
151
+ --template-id adaptive-image-video \
152
+ --carousel-items "https://cdn.example.com/a.jpg" \
153
+ --carousel-items "https://cdn.example.com/b.jpg" \
154
+ --carousel-items "https://cdn.example.com/c.jpg"
155
+ ```
156
+
157
+ This template auto-adapts per-image hold time to the image count (1 image = 8s, 2 = 4s each, 3+ = 3s each), so 3 images yields a ~9s video instead of the 2s black clip.
158
+
159
+
129
160
  ## Test mode: skip asset generation (`--stub-image-url` / `--stub-video-url`)
130
161
 
131
162
  **Purpose**: during dev / debug the user wants to exercise the whole pipeline without burning gen-image / gen-video quota. In the DSL this becomes: image / video AssetRefs are written as `source:"existing"` + `status:"generated"` + `url:<stub>`, no `payload.prompt`; the downstream `prepare-video-assets` resolver skips the matching atomic skill.
@@ -228,6 +259,8 @@ python3 <SkillDir>/scripts/gen_script.py \
228
259
  | `-o` / `--output` | Output DSL file path. | stdout |
229
260
  | `--stub-image-url` | Test mode: every image AssetRef is written as existing + generated + this URL, no prompt (env: `STUB_IMAGE_URL`). | — |
230
261
  | `--stub-video-url` | Test mode: every video AssetRef is written as existing + generated + this URL, no prompt (env: `STUB_VIDEO_URL`). | — |
262
+ | `--carousel-items` | Repeatable. Media URL placed directly into `customPayload.carousel.items` for `carousel-caption` templates (e.g. `adaptive-image-video`, `spotlight-card`). Bypasses gen-image. **Required** for `carousel-caption` templates when the user supplies images. | — |
263
+ | `--caption-lines` | Repeatable. On-screen typewriter caption line for `carousel-caption` templates → `customPayload.caption.lines`. Supports `**emphasis**`. Optional for purely visual templates. | — |
231
264
 
232
265
  ## DSL generation principles
233
266
 
@@ -842,6 +842,25 @@ def build_dsl(
842
842
  f"ℹ️ contract: payloadStyle=carousel-caption for template {template_id}",
843
843
  file=sys.stderr,
844
844
  )
845
+ # 兜底校验:carousel-caption 模板的画面由 carousel_items(图片/视频 URL)驱动,
846
+ # 文字由 caption_lines 驱动。两者皆空时会生成一个空轮播 + 空字幕的退化场景——
847
+ # 渲染出来就是「黑屏 + fit-caption 退化成最短 2s」。这是调用方(agent)忘了
848
+ # 把用户提供的图片塞进 --carousel-items 的典型表现,必须显式报错而不是静默产出。
849
+ if not (carousel_items or []) and not (caption_lines or []):
850
+ print(
851
+ "❌ carousel-caption template "
852
+ f"'{template_id}' needs visual or text content, but received neither "
853
+ "--carousel-items nor --caption-lines.\n"
854
+ " This template renders a carousel of user-supplied media; with no items "
855
+ "it produces a black, minimum-length (2s) clip.\n"
856
+ " Fix: pass the user's image/video URLs via --carousel-items "
857
+ "(repeat the flag per item), e.g.\n"
858
+ " gen_script.py --topic <topic> --template-id "
859
+ f"{template_id} --carousel-items <url1> --carousel-items <url2> ...\n"
860
+ " Optionally add --caption-lines '<text>' for on-screen typewriter captions.",
861
+ file=sys.stderr,
862
+ )
863
+ sys.exit(1)
845
864
  return _build_carousel_caption_dsl(
846
865
  template_id=template_id,
847
866
  topic=topic,