@remixmate/cli 0.9.49 → 0.9.50

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.49",
4
- "generatedAt": "2026-09-26T14:13:13.805Z",
3
+ "version": "0.9.50",
4
+ "generatedAt": "2026-09-27T01:55:22.557Z",
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.49",
3
+ "version": "0.9.50",
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",
@@ -1873,6 +1873,11 @@ def _persist_plan_checkpoint(render_plan: dict, job_id: Optional[int], private_t
1873
1873
  LogPrint(f" ⚠️ RenderPlan checkpoint failed (jobId={job_id}): {exc}", file=sys.stderr)
1874
1874
 
1875
1875
 
1876
+
1877
+ def _builtin_dynamic_render_enabled() -> bool:
1878
+ """内置模板是否也走 /renderDraft(Phase 3b 路由翻转开关,默认关)。"""
1879
+ return os.environ.get("REMIXMATE_BUILTIN_DYNAMIC_RENDER", "").strip().lower() in {"1", "true", "yes", "on"}
1880
+
1876
1881
  def render_with_remote_api(
1877
1882
  render_plan: dict,
1878
1883
  output_path: str,
@@ -1941,6 +1946,13 @@ def render_with_remote_api(
1941
1946
  status_path = "/renderStatus"
1942
1947
 
1943
1948
  source_oss_key = None
1949
+ # 内置模板是否也走动态渲染(Phase 3b 路由翻转,ab-platform/docs/
1950
+ # template-authoring-page-review.md §7.2)。默认关:翻转依赖 ab-render 以服务身份取
1951
+ # 内置源码(DRAFT_BUILTIN_SOURCE_TOKEN ↔ ab-api ab_render.service_token),服务端没配好
1952
+ # 就打开,普通用户渲染内置模板会全部失败。服务端就绪后设 REMIXMATE_BUILTIN_DYNAMIC_RENDER=1;
1953
+ # 回退 = 取消该变量,内置模板回到 /render。
1954
+ builtin_dynamic = _builtin_dynamic_render_enabled()
1955
+ is_builtin_dynamic = False
1944
1956
  template_id = render_plan.get("templateId", "")
1945
1957
  if template_id:
1946
1958
  try:
@@ -1950,8 +1962,12 @@ def render_with_remote_api(
1950
1962
  # 是另一个模板的画面。
1951
1963
  _meta = get_template(template_id, include_all_statuses=True)
1952
1964
  if _meta and not _meta.get("isBuiltin"):
1953
- # hasSource 是新字段;sourceOssKey 兼容尚未升级的 ab-api
1954
- source_oss_key = _meta.get("hasSource") or _meta.get("sourceOssKey")
1965
+ source_oss_key = _meta.get("hasSource")
1966
+ elif _meta and builtin_dynamic:
1967
+ # 内置模板:客户端拿不到也不需要 sourceOssKey(源码保护),只要知道
1968
+ # 它在 registry 里;ab-render 按 templateKey 以服务身份取包。
1969
+ source_oss_key = True
1970
+ is_builtin_dynamic = True
1955
1971
  except Exception:
1956
1972
  source_oss_key = None
1957
1973
 
@@ -1970,6 +1986,10 @@ def render_with_remote_api(
1970
1986
  # 不传则 ab-render 退回截首帧 / 不渲。
1971
1987
  if cover_composition_id:
1972
1988
  payload["coverCompositionId"] = cover_composition_id
1989
+ if is_builtin_dynamic:
1990
+ # 与预构建 /render 的 MainVideo 语义对齐:不把 entry.props 摊平到顶层
1991
+ # (摊平会让同名键覆盖平台注入的 typography / variantId 等)。
1992
+ payload["spreadEntryProps"] = False
1973
1993
  render_path = "/renderDraft"
1974
1994
  status_path = "/renderDraftStatus"
1975
1995
  else:
@@ -1988,6 +2008,8 @@ def render_with_remote_api(
1988
2008
  if pending_resume:
1989
2009
  # 续跑:下面那堆"正在提交"的日志会误导人,跳过
1990
2010
  LogPrint(f"🎬 Remote render task already exists, will resume polling", file=sys.stderr)
2011
+ elif is_builtin_dynamic:
2012
+ LogPrint(f" Builtin template (dynamic bundle): {template_id}", file=sys.stderr)
1991
2013
  elif source_oss_key:
1992
2014
  LogPrint(f" Private template (OSS dynamic bundle): {template_id}", file=sys.stderr)
1993
2015
  else:
@@ -2,6 +2,6 @@
2
2
  "skillName": "render-video",
3
3
  "repoName": "agent-skill-media-maker",
4
4
  "skillId": "473",
5
- "version": "V29",
5
+ "version": "V30",
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
  }