@remixmate/cli 0.9.68 → 0.9.69

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.68",
4
- "generatedAt": "2026-10-05T12:22:45.024Z",
3
+ "version": "0.9.69",
4
+ "generatedAt": "2026-10-05T15:20:28.516Z",
5
5
  "skills": [
6
6
  {
7
7
  "id": "doc-parse",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remixmate/cli",
3
- "version": "0.9.68",
3
+ "version": "0.9.69",
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",
@@ -117,14 +117,28 @@ python3 <SkillDir>/scripts/render_video.py --job-id 42 --upload-title "My video"
117
117
  After rendering, the script auto-uploads by default; `render-manifest.json` then contains an
118
118
  `upload.fileUrl` field, and `upload.playbackUrl` (transcoded) once VOD processing finishes.
119
119
 
120
- **Do not retype the video URL into your reply.** On success the script prints a structured
121
- `__render_video_asset__` line; the host reads the authoritative URL from there and renders a
122
- player for the user. Tell the user the video is ready — the player appears on its own.
123
-
124
- Reproducing a 32-char opaque URL from memory is unreliable: on 2026-08-30 a single character
125
- was dropped (`…c1c20102` → `…c1c2012`), so the user got a 404 while the file sat fine on the
126
- CDN. The URL in your prose is redundant with the structured asset and is the only copy that
127
- can be wrong — the UI now renders it as plain, non-clickable text for exactly this reason.
120
+ On success the script prints these lines on stdout:
121
+
122
+ ```
123
+ 🎬 Video playback URL: <videoUrl>
124
+ 🖼️ Cover image URL: <coverUrl> # only when the template ships a cover
125
+ __render_video_asset__ {"url": "...", "coverUrl": "...", "durationSec": ...}
126
+ ```
127
+
128
+ How to report the result depends on the host:
129
+
130
+ - **Host with a built-in player** (the RemixMate web app; the env has `REMIXMATE_HOST=workbuddy`):
131
+ do **not** retype the URLs. The host reads `__render_video_asset__` and renders the player and
132
+ cover itself. Just tell the user the video is ready.
133
+ - **Any other host** (Codex, Claude Code, other CLIs): nothing renders a player, so the links in
134
+ your reply are the only way the user can get to the result. You **must** output both:
135
+ - the video link (from `🎬 Video playback URL`)
136
+ - the cover link (from `🖼️ Cover image URL`, or `coverUrl` in `__render_video_asset__`).
137
+ If neither is printed, say the template has no cover rather than leaving it out silently.
138
+
139
+ Copy each URL **verbatim from the stdout line**, character for character. Never retype one
140
+ from memory: on 2026-08-30 a single character was dropped (`…c1c20102` → `…c1c2012`), and the
141
+ user got a 404 while the file sat fine on the CDN.
128
142
 
129
143
  ### Render but skip the upload
130
144
 
@@ -3059,6 +3059,10 @@ Examples:
3059
3059
  effective_playback = playback_url or remote_url
3060
3060
  if effective_playback and not effective_playback.startswith("vod://"):
3061
3061
  print(f"\n🎬 Video playback URL: {effective_playback}")
3062
+ # 封面也走 stdout:Codex / Claude Code 等没有内联播放器的宿主只能从
3063
+ # 这里拿到封面地址(之前只打到 stderr,模型回复里因此只有视频没有封面)。
3064
+ if upload_info.get("coverUrl"):
3065
+ print(f"🖼️ Cover image URL: {upload_info['coverUrl']}")
3062
3066
 
3063
3067
  # 结构化资产标记 —— 宿主(ab-agent)据此把权威 URL 作为 attachment
3064
3068
  # 下发前端渲染播放器,绕开模型正文。
@@ -3113,6 +3117,9 @@ Examples:
3113
3117
  # ab-api 保存 manifest 时按 fileId 给成片建语义卡 / 片段 / 血缘
3114
3118
  "fileId": upload_result.get("fileId"),
3115
3119
  }
3120
+ # 本地渲染 + 上传成功时同样把地址放到 stdout,供无播放器的宿主回显给用户
3121
+ if upload_result.get("fileUrl"):
3122
+ print(f"\n🎬 Video playback URL: {upload_result['fileUrl']}")
3116
3123
  if manifest_path:
3117
3124
  save_json(manifest, manifest_path)
3118
3125
  LogPrint(f" Manifest updated: {manifest_path}", file=sys.stderr)
@@ -2,6 +2,6 @@
2
2
  "skillName": "render-video",
3
3
  "repoName": "agent-skill-media-maker",
4
4
  "skillId": "473",
5
- "version": "V35",
5
+ "version": "V36",
6
6
  "skillDescription": "Final-render skill: loads a persisted RenderPlan by `job_id` and drives the Remotion engine to produce the final video.\n\nUse this skill as soon as the user mentions any of these intents (after assets are already prepared):\n- Render the video, composite the video, export the video\n- Turn the prepared assets into the final clip\n- Render with Remotion\n\nPrerequisite: assets must already be generated via `prepare_video_assets`. This skill never resolves or regenerates assets — pass it a `job_id` from a previous `prepare_video_assets` call.\n\n⚠️ Stop-and-confirm gate: never call this skill until the user has explicitly confirmed the assets prepared by `prepare_video_assets`. If those assets were prepared in the current turn and the user has not replied since, stop and ask instead of rendering."
7
7
  }