style-edit

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Style edit

Style edit(风格化剪辑)

Paths:
${CLAUDE_SKILL_DIR}
means the folder containing this SKILL.md, and
${CLAUDE_PLUGIN_ROOT}
the plugin folder two levels above it.
Read
${CLAUDE_PLUGIN_ROOT}/PRINCIPLES.md
first: the rules every video follows (where, asking, looking real, motion, story, privacy, cost).
Every question goes in the question box: the AskUserQuestion tool (2-4 options, recommended first). Only in an agent without it, ask numbered questions in text.
Attached images: <paths>
in an answer: Read each first.
An approved cut and a creator's style in (a
skill=
job runs that skill: start step 3). The finished video out: captions, zooms, real captures and motion scenes timed to the words, in the creator's look and the user's brand. The user approves the stills on the review page (step 5) and picks the render (step 6).
Paths are relative to the library (PRINCIPLES.md). Run the scripts with
python3
on Mac and Linux,
py
on Windows.
S="${CLAUDE_SKILL_DIR}/scripts"
,
VPY="${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/run.py"
;
python3 "$VPY"
is the venv Python.
edits/<name>/cut.mp4 + cut.transcript.json + words.json       (cut)
edits/<name>/style.json                                       (start: the profile's creators blended)
  or creator-teardowns/<handle>/style.json                    (one creator, from creator-teardown)
~/.ai-video-editor/profile.json                               (start: brand kit, names, assets, avoid, sound)
captions.json -> beats.json -> visuals.json -> images/ + images.json -> plan.json -> stills/sheet.png -> render.mp4
References, read only when a step says:
references/visuals.md
(each format in detail),
references/plan.md
(plan.py, cutout, sound, music, checks),
references/motion.md
(templates, transitions, marks),
references/render.md
(targets, live preview, export),
references/review.md
(the review page),
references/ai-tells.md
(the banned AI looks).
references/contracts.md
is for people: never read it.
Paths:
${CLAUDE_SKILL_DIR}
表示包含此 SKILL.md 的文件夹,
${CLAUDE_PLUGIN_ROOT}
表示上两级的 plugin 文件夹。
先读取
${CLAUDE_PLUGIN_ROOT}/PRINCIPLES.md
:每个视频都应遵循的规则(放置位置、提问方式、真实感、motion、story、privacy、cost)。
所有问题都应放进问题框:使用 AskUserQuestion 工具(提供 2-4 个选项,并将推荐项放在首位)。仅当 Agent 没有该工具时,才在文本中提出编号问题。回答中的
Attached images: <paths>
:先逐一读取。
输入是已批准的 cut 和一位创作者的风格(
skill=
job 会运行指定的 skill:start 的第 3 步)。 输出是最终视频:字幕、缩放、真实抓图,以及与话语节奏同步的 motion 场景, 整体呈现创作者的视觉风格和用户自己的品牌。用户会在 review page 上审批 stills(第 5 步), 并选择渲染目标(第 6 步)。
以下路径相对于 library(PRINCIPLES.md)。在 Mac 和 Linux 上使用
python3
运行脚本, 在 Windows 上使用
py
。
S="${CLAUDE_SKILL_DIR}/scripts"
,
VPY="${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/run.py"
;
python3 "$VPY"
是 venv Python。
edits/<name>/cut.mp4 + cut.transcript.json + words.json       (cut)
edits/<name>/style.json                                       (start: the profile's creators blended)
  or creator-teardowns/<handle>/style.json                    (one creator, from creator-teardown)
~/.ai-video-editor/profile.json                               (start: brand kit, names, assets, avoid, sound)
captions.json -> beats.json -> visuals.json -> images/ + images.json -> plan.json -> stills/sheet.png -> render.mp4
仅在对应步骤要求时读取参考资料:
references/visuals.md
(详细说明每种格式)、
references/plan.md
(plan.py、cutout、sound、music、checks)、
references/motion.md
(templates、 transitions、marks)、
references/render.md
(targets、live preview、export)、
references/review.md
(review page)、
references/ai-tells.md
(禁止使用的 AI 风格)。
references/contracts.md
是给人员看的:绝不要读取。

0. Read the taste and profile

0. 读取 taste 和 profile

bash
python3 "${CLAUDE_PLUGIN_ROOT}/skills/taste/scripts/taste.py" show --edit edits/<name>
python3 "${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/profile.py" show
Follow every taste rule; the scripts read the settings themselves. When the user reacts to a result ("too slow", "captions too small"), save it with the taste skill before redoing the edit.
bash
python3 "${CLAUDE_PLUGIN_ROOT}/skills/taste/scripts/taste.py" show --edit edits/<name>
python3 "${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/profile.py" show
遵循每一条 taste 规则;脚本会自行读取设置。当用户对结果作出反馈 (“太慢了”“字幕太小”)时,重做剪辑前先用 taste skill 保存反馈。

1. Check the inputs

1. 检查输入

  • No cut.mp4? Run the cut skill first, never style a raw take.
    prep-decisions.json
    ?
    The
    visual-prep
    agent did steps 1-3 and the sheet:
    references/plan.md
    "Prepared while the cut was reviewed".
  • No style.json?
    python3 "${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/profile.py" style edits/<name>
    . With no creators in the profile (or no profile) it writes the default style: a smooth zoom move at least every 5 s, 3-word captions (
    references/plan.md
    "No creator"). If it stops with
    no creator style.json found
    , run creator-teardown quick mode for the profile's creators, then again. plan.py also plans with the default style when style.json is missing, and says so.
  • The user's images: everything in the profile's
    assets_dir
    that fits a line, plus anything they hand over, goes in
    edits/<name>/images/
    and
    images.json
    :
    [{"src": "images/dashboard.png", "word": "dashboard", "nth": 1}]
    (optional
    layout
    ,
    hold_s
    ,
    entrance
    ; transparent PNG and Lottie
    .json
    work).
  • What the user added on the page (
    assets.json
    , review.py
    wait
    's
    assets:
    line): first, before any search, each on its
    say
    words, as
    agents/visual-prep.md
    step 2 says. One not in images.json or visuals.json yet is new.
  • 没有 cut.mp4? 先运行 cut skill,绝不对 raw take 进行风格化处理。存在
    prep-decisions.json
    ?
    说明 visual-prep Agent 已完成第 1-3 步和 sheet:参见
    references/plan.md
    中的“Prepared while the cut was reviewed”。
  • 没有 style.json? 运行
    python3 "${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/profile.py" style edits/<name>
    。 如果 profile 中没有 creator(或根本没有 profile),它会写入默认风格:每至少 5 秒一次平滑 zoom, 以及 3 个词一条的字幕(参见
    references/plan.md
    中的“No creator”)。如果命令因
    no creator style.json found
    而停止,先对 profile 中的 creator 运行 creator-teardown quick mode,然后再次运行。 缺少 style.json 时,plan.py 也会使用默认风格进行规划,并明确提示这一点。
  • 用户的图片: profile 的
    assets_dir
    中所有与某句台词相符的素材,以及用户主动提供的素材, 都应放入
    edits/<name>/images/
    并记录在
    images.json
    中:
    [{"src": "images/dashboard.png", "word": "dashboard", "nth": 1}]
    (可选
    layout
    、
    hold_s
    、
    entrance
    ;透明 PNG 和 Lottie
    .json
    均可使用)。
  • 用户在页面上添加的内容(
    assets.json
    ,review.py
    wait
    的
    assets:
    行):先于任何搜索处理, 根据各自的
    say
    对应词进行匹配,遵循
    agents/visual-prep.md
    第 2 步。若某项尚未出现在 images.json 或 visuals.json 中,则将它视为新增内容。

2. Captions text

2. 字幕文本

bash
python3 "${CLAUDE_PLUGIN_ROOT}/skills/cut/scripts/retakes.py" captions edits/<name>
Writes
captions.json
and
captions.txt
: the words heard in the finished cut (the verify step's
cut.transcript.json
), timed to it, with every word that pass heard differently ("Jeff" for "Jev") spelled as the approved cut text has it, names spelled as the profile's
names
, and every earlier
retakes.py fix
applied. It prints each word it changed. Never read either JSON: proofread
captions.txt
, the file captions are built from. A word still wrong is one command, which fixes captions.json in place, timings untouched, and is kept in
fixes.json
for every later captions run:
bash
python3 "${CLAUDE_PLUGIN_ROOT}/skills/cut/scripts/retakes.py" fix edits/<name> cloud=Claude jiv=Jev
Use captions.json from here on.
bash
python3 "${CLAUDE_PLUGIN_ROOT}/skills/cut/scripts/retakes.py" captions edits/<name>
该命令写入
captions.json
和
captions.txt
:内容来自最终 cut 中听到的词(verify 步骤生成的
cut.transcript.json
),并与其时间轴对齐。如果某次 pass 听到的词不同(例如 approved cut 中是“Jeff”, 听到的是“Jev”),则按照 approved cut 中的拼写处理;姓名按照 profile 的
names
拼写; 并应用此前执行过的所有
retakes.py fix
。命令会打印每个修改过的词。不要读取其中任何一个 JSON: 应校对
captions.txt
,字幕就是根据该文件构建的。如果仍有错误单词,只需一条命令即可修正, 它会原地更新 captions.json,保持时间轴不变,并将修正记录保存在 fixes.json 中,供之后每次字幕运行使用:
bash
python3 "${CLAUDE_PLUGIN_ROOT}/skills/cut/scripts/retakes.py" fix edits/<name> cloud=Claude jiv=Jev
从这一步开始使用 captions.json。

3. Visuals

3. Visual

Read
references/shapes.md
and
references/motion-design.md
first
: each pick's shape and plan.py's rules, then the default look and motion (built animations over captures, big in the band, one capture a page).
  1. Propose:
    python3 "$S/route.py" beats edits/<name>
    splits captions.json into sentences, marks the named things (profile, logo-pack) into beats.json. Pick one route per sentence yourself (
    none
    ,
    capture:shot|browser|sticker
    ,
    post
    ,
    logo
    ,
    logo_cluster
    ,
    chat
    ,
    terminal
    ,
    toasts
    ,
    side_by_side
    ,
    video_card
    ).
  2. Real things first: write
    visuals.json
    (
    references/shapes.md
    ): a named product or doc becomes a
    capture
    (with
    marks
    found by text), a quoted post a
    post
    , an app an
    app
    , a video a
    youtube
    , a repo a
    github
    , a brand in passing a
    logo
    , an expert's words a clip (
    references/visuals.md
    "Sourced proof").
  3. Fill the overlays: for the overlay picks, write only the props (
    references/shapes.md
    ). Hand it to the
    template-filler
    agent (haiku) with the full path of
    references/shapes.md
    when available, else write them. Only words and numbers the speaker said. There are no type cards.
  4. Fetch:
    node "$S/capture.mjs" edits/<name>
    fetches captures, logos, posts into
    images/
    , marks measured.
  5. Motion: moving-template beats become bespoke clips (motion skill); a failed clip keeps its card.
Pacing: a copied creator's rate wins. route.py prints her cards a minute, kinds and place in the frame, and marks that many sentences
want
(named ones first). Give each a card of her kind with a
box
at her place, clear of the head: the user's own photo, else a capture of the real thing the line is about (page, profile, post), else their own clip as a
video_card
. Never a made-up or stock picture: a
want
with nothing real stays empty. Never ask what to show: pick the real capture (their own product's too). No creator: a card only where a line names something real. Never two at once; no stretch without a card over
card_gap_s
(plan.py adds zooms there,
references/plan.md
"Pacing"). Vertical captures need a
find
to read on a phone. Card edit:
shapes.md
.
先读取
references/shapes.md
和
references/motion-design.md
:了解每种选择的 shape 和 plan.py 的规则, 再了解默认外观与 motion(叠在抓图上的 built animations、在 band 中放大、一页只放一张抓图)。
  1. 提出方案:
    python3 "$S/route.py" beats edits/<name>
    将 captions.json 拆分为句子, 并把被点名的对象(profile、logo-pack)标记到 beats.json 中。自行为每个句子选择一个 route (
    none
    、
    capture:shot|browser|sticker
    、
    post
    、
    logo
    、
    logo_cluster
    、
    chat
    、
    terminal
    、
    toasts
    、
    side_by_side
    、
    video_card
    )。
  2. 优先使用真实对象: 编写 visuals.json(参见
    references/shapes.md
    ):被点名的产品或文档使用
    capture
    (通过文本查找
    marks
    ),引用的帖子使用
    post
    ,App 使用
    app
    ,视频使用
    youtube
    , 仓库使用
    github
    ,顺带提及的品牌使用
    logo
    ,专家的原话使用
    clip
    (参见
    references/visuals.md
    中的“Sourced proof”)。
  3. 填充 overlay: 对于 overlay 类选择,只填写 props(参见
    references/shapes.md
    )。 如果可以访问完整路径,请将其交给
    template-filler
    Agent(haiku);否则自行编写。 只使用说话者实际说过的词和数字。不使用文字卡。
  4. 抓取:
    node "$S/capture.mjs" edits/<name>
    将抓图、logo 和帖子获取到
    images/
    ,并记录实测标记。
  5. Motion: 使用 motion skill 将 moving-template beat 转换为定制 clip;如果 clip 生成失败,则保留对应的 card。
节奏:复刻 creator 时,以其节奏为优先。route.py 会输出每分钟的 card 数量、种类及其在 frame 中的位置, 并将相应数量的句子标记为
want
(优先处理被点名的对象)。为每条
want
句子配上一张相同种类的 card, 使用
box
将其放在对应位置,并避开头部:优先使用用户自己的照片,其次使用该句所涉及真实对象的抓图 (page、profile、post),最后使用用户自己的 clip 作为
video_card
。绝不使用虚构图片或 stock 图片: 如果某个
want
找不到真实素材,就保持为空。绝不要询问应该展示什么:直接选择真实抓图 (也可以是用户自己的产品)。没有 creator 风格时,仅当某句台词提到真实对象才添加 card。 同一时间绝不能出现两张 card;任何超过
card_gap_s
的片段都不能完全没有 card (plan.py 会在这些位置添加 zoom,参见
references/plan.md
中的“Pacing”)。 竖向抓图需要使用
find
定位,才能在手机上看清。修改 card:参见
shapes.md
。

4. Plan

4. Plan

Find the speaker's head first, so no box covers the face, then plan with step 1's style.json:
bash
python3 "$VPY" "$S/face.py" edits/<name>
python3 "$S/plan.py" edits/<name>/style.json edits/<name>/captions.json [--aspect 9:16|16:9] [--layout overlay|split|letterbox]
Writes
edits/<name>/plan.json
. Read every warning. It ends with the style check (
style_check.py
): each
style:
line is a way the plan differs from the creator. Fix each (style.json, visuals.json, images.json) and plan again before the stills; what the user changed is already the target.
  1. Music follows the style unless the user set it (
    references/plan.md
    "Music"; plan.py lays the creator's bed itself), then plan.py again. Sound cues need nothing: plan.py adds them.
  2. Behind the speaker: if the profile says
    "behind": true
    , run
    matte.py
    after the last plan.py run and again after any later one (it cuts only new frames); say its
    --estimate
    first (
    references/plan.md
    ).
  3. Check the plan:
bash
python3 "$S/check.py" plan edits/<name> [--plan plan.json] [--style edits/<name>/style.json]
Fix every FAIL and plan again. What it FAILs:
references/plan.md
.
先找到说话者的头部,确保没有 box 遮挡面部,然后使用第 1 步中的 style.json 进行规划:
bash
python3 "$VPY" "$S/face.py" edits/<name>
python3 "$S/plan.py" edits/<name>/style.json edits/<name>/captions.json [--aspect 9:16|16:9] [--layout overlay|split|letterbox]
命令会写入
edits/<name>/plan.json
。读取每一条 warning。命令最后会执行 style check (
style_check.py
):每一条
style:
行都表示 plan 与 creator 风格存在的一处差异。 逐项修正(修改 style.json、visuals.json、images.json),并在生成 stills 前再次 plan; 用户已经更改的内容就是最终目标。
  1. Music 默认遵循风格,除非用户另有设置(参见
    references/plan.md
    中的“Music”; plan.py 会自行铺入 creator 的音乐底轨),之后再次运行 plan.py。Sound cue 无需额外处理:plan.py 会添加。
  2. 位于说话者身后: 如果 profile 中为
    "behind": true
    ,在最后一次 plan.py 运行后执行 matte.py, 后续每次再次运行 plan.py 后也要重新执行(它只处理新增帧);先说明
    --estimate
    的结果 (参见
    references/plan.md
    )。
  3. 检查 plan:
bash
python3 "$S/check.py" plan edits/<name> [--plan plan.json] [--style edits/<name>/style.json]
修复每一个 FAIL,然后再次 plan。所有 FAIL 的含义参见
references/plan.md
。

5. Stills, checked by you, then straight to the render

5. Stills,由你检查,然后直接进入渲染

The user approved the cut: that approve means make the edit. Never put the stills on the review page and never wait for a second approve (Max, 2026-10-15: users did not like the frames step).
bash
python3 "$S/edit.py" stills edits/<name>
The first run installs the renderer (a few minutes, once; say so first). Writes one still per beat,
stills/sheet.png
(labelled with beat, time and card kind). Review the sheet yourself; open a single still only to zoom in. Fix before rendering: a box on the face, a zoom cutting the head, the wrong part of a capture, text too small for a phone, a default AI look.
stills-critic
can check it. Then go on to step 6 and render; the user's notes come on the rendered edit. Moving cards by hand only when the user asks:
references/render.md
"The live preview".
用户已经批准 cut:该批准意味着直接制作剪辑。绝不要将 stills 放到 review page, 也绝不要等待第二次批准(Max,2026-10-15:用户不喜欢这个逐帧确认步骤)。
bash
python3 "$S/edit.py" stills edits/<name>
首次运行会安装 renderer(需要几分钟,只安装一次;先告知用户)。命令会为每个 beat 写入一张 still, 并生成
stills/sheet.png
(标注 beat、时间和 card 种类)。自行审阅 sheet;只有在需要放大检查时 才打开单张 still。渲染前修复以下问题:box 遮挡面部、zoom 裁掉头部、抓取了错误区域、 文字在手机上太小、呈现出默认 AI 风格。
stills-critic
可以协助检查。随后进入第 6 步并渲染; 用户的修改意见会在渲染后的剪辑上处理。只有用户明确要求时,才手动移动 card (参见
references/render.md
中的“The live preview”)。

6. Where to render

6. 渲染位置

bash
python3 "$S/edit.py" estimate edits/<name>
Prints
Laptop:
,
Modal:
and two
Other:
lines (GitHub Actions, Lambda) with this video's time and cost, then
Recommended:
: Modal once it is connected, the video is over a minute and Modal is quicker; the laptop otherwise.
render
in the profile, or
Recommended: Laptop
: render there with no question, one line with the time ("Rendering on your laptop, about 14 s. Say 'render on Modal' to change"). Not set and
Recommended: Modal
: ask once, three options in this order with the printed numbers, Modal marked (Recommended), then
profile.py set render='"laptop|modal|github|lambda"'
.
  1. Laptop: its time, free.
  2. Modal: its time and cost ($30 free credit a month). Not connected: label it Connect Modal; on that pick run
    setup.py modal-connect
    in the background (the setup skill's Modal step), then render on Modal.
  3. Other: GitHub Actions or AWS Lambda: both
    Other:
    lines in the description. On this pick, ask a second question with the two. GitHub Actions: free, needs
    gh
    logged in, the footage goes into a private repo in their account; ask before creating the repo. Lambda: their own AWS account. No
    cloud_cleanup
    in the profile: ask once "Delete the uploaded footage from <GitHub|AWS> after rendering?" (Yes (Recommended) / No, keep it there), then
    profile.py set cloud_cleanup=true|false
    .
Modal picked but not connected:
setup.py modal-connect
first (above). Lambda picked and
aws sts get-caller-identity
fails: the setup skill's Lambda section first.
bash
python3 "$S/edit.py" estimate edits/<name>
命令会输出
Laptop:
、
Modal:
和两行
Other:
(GitHub Actions、Lambda),其中包含本视频的 预计时间和成本,随后输出
Recommended:
。Modal 连接后,如果视频超过一分钟且 Modal 更快, 则推荐 Modal;否则推荐 laptop。如果 profile 中已设置
render
,或者输出为
Recommended: Laptop
, 直接在该位置渲染,无需提问,只需用一行告知时间,例如“正在你的 laptop 上渲染,预计约 14 秒。 如需更改,请说‘render on Modal’”。如果尚未设置且推荐 Modal,则提问一次,按打印出的数字依次提供 三个选项,并将 Modal 标记为(Recommended),随后运行
profile.py set render='"laptop|modal|github|lambda"'
。
  1. Laptop:显示预计时间,免费。
  2. Modal:显示预计时间和成本(每月有 $30 免费额度)。如果尚未连接,选项应标记为 Connect Modal;选择后,在后台运行
    setup.py modal-connect
    (setup skill 的 Modal 步骤), 然后在 Modal 上渲染。
  3. Other:GitHub Actions 或 AWS Lambda:在说明中同时显示两条
    Other:
    信息。选择该项后, 再提出一个包含这两个选项的问题。GitHub Actions 免费,但要求已登录
    gh
    ;素材会被放入用户账户中的 private repo;创建 repo 前必须征求用户同意。Lambda 使用用户自己的 AWS 账户。 如果 profile 中没有
    cloud_cleanup
    ,则询问一次:“渲染后要删除上传到 <GitHub|AWS> 的素材吗?” (是(推荐)/否,保留在那里),然后运行
    profile.py set cloud_cleanup=true|false
    。
选择了 Modal 但尚未连接:先执行
setup.py modal-connect
(见上文)。选择了 Lambda 且
aws sts get-caller-identity
失败:先执行 setup skill 的 Lambda 部分。

7. Render and check

7. 渲染和检查

bash
python3 "$S/edit.py" render edits/<name>            # laptop
python3 "$S/edit.py" render edits/<name> --modal    # Modal
python3 "$S/edit.py" render edits/<name> --lambda   # AWS Lambda
python3 "$S/edit.py" render edits/<name> --draft    # laptop, 2/3 size, quick look: render-draft.mp4
All but
--draft
write
edits/<name>/render.mp4
. GitHub Actions (
--github
, then
github-push
and
github-fetch
) and every target's detail:
references/render.md
. Then, before the user sees it:
bash
python3 "$VPY" "$S/check.py" render edits/<name> [--plan plan.json] [--style edits/<name>/style.json]
FAILs go back to the plan or the cut; at most two fix rounds, then show the render with what is still listed. A caption contrast FAIL: plan again, then render (plan.py reads the check and steps those pages up). The full list:
references/plan.md
.
A
loudness ... LUFS
or take's own
true peak
WARN is the take's level, not a fault in the edit.
loudness
in the profile: do that, no question. Not set: ask once, then
profile.py set loudness='"leave|normalize"'
:
Your video is quieter than most reels. Make it as loud as Instagram and TikTok expect? (louder: "...louder than most reels. Bring it down to what they expect?") Details: <N> LUFS; the apps play speech at about -14.
  • Leave my audio as it is (Recommended). Nothing is touched.
  • Make it as loud as the apps expect (or Bring it down). One volume change, never past a -1 dB peak.
Numbers only on the Details line. Check output (FAIL, WARN, "2 frames short") never reaches the user.
Only on the second answer:
python3 "$S/quality.py" normalize edits/<name>/render.mp4
. It writes
render-normalized.mp4
beside it; hand over that file.
bash
python3 "$S/edit.py" render edits/<name>            # laptop
python3 "$S/edit.py" render edits/<name> --modal    # Modal
python3 "$S/edit.py" render edits/<name> --lambda   # AWS Lambda
python3 "$S/edit.py" render edits/<name> --draft    # laptop, 2/3 size, quick look: render-draft.mp4
除
--draft
外,所有命令都会写入
edits/<name>/render.mp4
。GitHub Actions 的使用方式为 (
--github
,然后执行
github-push
和
github-fetch
);各目标的详细说明参见
references/render.md
。 在用户看到成片前执行:
bash
python3 "$VPY" "$S/check.py" render edits/<name> [--plan plan.json] [--style edits/<name>/style.json]
对于 FAIL,返回 plan 或 cut 步骤处理;最多进行两轮修复,然后展示 render,并列出仍未解决的问题。 如果出现字幕对比度 FAIL:再次 plan,然后再次 render(plan.py 会读取检查结果并相应调整这些页面)。 完整列表参见
references/plan.md
。
loudness ... LUFS
或素材自身的
true peak
WARN 表示原始素材的响度,不是剪辑错误。 如果 profile 中已设置
loudness
,直接按设置执行,无需提问。如果尚未设置,则询问一次,然后运行
profile.py set loudness='"leave|normalize"'
:
你的视频比大多数短视频更安静。要将它调整到 Instagram 和 TikTok 预期的响度吗?(更响时:“……比大多数短视频更响。要将它降低到它们预期的响度吗?”)详情:<N> LUFS;这些应用播放语音时大约使用 -14。
  • 保持我的音频原样(推荐)。 不做任何处理。
  • 将音量调整到应用预期的响度(或调低音量)。只做一次音量调整,绝不超过 -1 dB peak。
Details 行只显示数字。检查输出(FAIL、WARN、“2 frames short”)绝不能展示给用户。
仅当用户选择第二个答案时:运行
python3 "$S/quality.py" normalize edits/<name>/render.mp4
。 该命令会在原文件旁写入
render-normalized.mp4
;将此文件交付给用户。

8. Hand over

8. 交付

Hand over on the review page (
references/review.md
),
serve
and
wait
in the background:
python3 "${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/review.py" edits/<name> round --stage edit --video edits/<name>/render.mp4
(no page:
start
, same flags). On
APPROVE
: motion skill
save
. Card and visual changes later: overlays skill (a motion clip: motion skill
note
); caption, zoom: plan, stills, render,
round
; cut: cut skill.
在 review page 上交付(
references/review.md
),在后台运行
serve
和
wait
:
python3 "${CLAUDE_PLUGIN_ROOT}/lib/ai_editor/review.py" edits/<name> round --stage edit --video edits/<name>/render.mp4
(如果没有页面:使用
start
,并沿用相同 flags)。收到
APPROVE
后:使用 motion skill
save
。 后续修改 card 和 visual:使用 overlays skill(如果是 motion clip:使用 motion skill
note
); 修改字幕或 zoom:依次执行 plan、stills、render、
round
;修改 cut:使用 cut skill。

9. Export to another editor

9. 导出到其他编辑器

Only when the user asks to finish it by hand ("open it in Final Cut", "send it to Premiere"):
bash
python3 "$S/export_nle.py" edits/<name> --to fcpxml|premiere|resolve|capcut|edl|srt|all
Writes
edits/<name>/export/
. Moving cards render with alpha first (about 0.7 s a card frame; say so). Which file to open, YouTube chapters for 16:9:
references/render.md
"Export to another editor".
仅当用户要求手动完成时使用(“在 Final Cut 中打开”“发送到 Premiere”):
bash
python3 "$S/export_npy" edits/<name> --to fcpxml|premiere|resolve|capcut|edl|srt|all
命令会写入
edits/<name>/export/
。移动 card 需要先带 alpha 进行渲染(每张 card frame 约 0.7 秒;先告知用户)。 应打开哪个文件,以及用于 16:9 视频的 YouTube chapters,参见
references/render.md
中的“Export to another editor”。

If a script stops

如果脚本停止

messagedo
no cut.mp4 in ...
(plan.py, face.py) or
cut.mp4 missing
(edit.py)
run the cut skill first
no creator style.json found for the profile's creators
creator-teardown quick mode, then
profile.py style
again
note: ... style.json not found; planning with the default style
fine with no creator;
profile.py style edits/<name>
keeps it with the edit
no cut.transcript.json
(retakes.py captions)
run the cut skill's verify step
the split layout is vertical only
plan again with
--layout overlay
check.py plan found a FAIL
(edit.py stills)
fix the FAIL in the plan, plan again
... missing (run matte.py)
run matte.py, then stills or render again
... missing (run sfx.py build, then plan.py)
do exactly that
no Chrome Headless Shell
(capture.mjs)
python3 "${CLAUDE_PLUGIN_ROOT}/skills/setup/scripts/setup.py" remotion
, then capture again
capture.mjs
failed <kind> '<word>'
drop that visual or give it another URL; the rest were saved
Modal is not set up on this computer
the setup skill's Modal step
the GitHub CLI (gh) is missing
/
... is public
setup's GitHub CLI section / a private repo only
the laptop render failed
references/render.md
"If a render stops"
the Modal render failed
/
the render failed. Open <url>
say so, offer the laptop render
messagedo
no cut.mp4 in ...
(plan.py、face.py)或
cut.mp4 missing
(edit.py)
先运行 cut skill
no creator style.json found for the profile's creators
运行 creator-teardown quick mode,然后再次运行
profile.py style
note: ... style.json not found; planning with the default style
没有 creator 也可以继续;运行
profile.py style edits/<name>
,让风格随剪辑一起保存
no cut.transcript.json
(retakes.py captions)
运行 cut skill 的 verify 步骤
the split layout is vertical only
使用
--layout overlay
再次 plan
check.py plan found a FAIL
(edit.py stills)
修复 plan 中的 FAIL,然后再次 plan
... missing (run matte.py)
运行 matte.py,然后再次生成 stills 或 render
... missing (run sfx.py build, then plan.py)
严格按照提示执行
no Chrome Headless Shell
(capture.mjs)
运行
python3 "${CLAUDE_PLUGIN_ROOT}/skills/setup/scripts/setup.py" remotion
,然后再次 capture
capture.mjs
failed <kind> '<word>'
删除该 visual,或为它提供另一个 URL;其他素材已经保存
Modal is not set up on this computer
执行 setup skill 的 Modal 步骤
the GitHub CLI (gh) is missing
/
... is public
执行 setup 的 GitHub CLI 部分 / 只能使用 private repo
the laptop render failed
参见
references/render.md
中的“If a render stops”
the Modal render failed
/
the render failed. Open <url>
如实告知用户,并提供在 laptop 上渲染的选项

Files

文件

  • scripts/
    : one script per step above, each with a
    demo
    self-check.
  • ${CLAUDE_PLUGIN_ROOT}/agents/template-filler.md
    (haiku),
    stills-critic.md
    (sonnet): the helpers.
  • ${CLAUDE_PLUGIN_ROOT}/remotion/
    : the renderer, copied to
    ~/.ai-video-editor/remotion
    on every run.
  • scripts/
    :上述每个步骤对应一个脚本,每个脚本都带有
    demo
    自检。
  • ${CLAUDE_PLUGIN_ROOT}/agents/template-filler.md
    (haiku)、
    stills-critic.md
    (sonnet):辅助 Agent。
  • ${CLAUDE_PLUGIN_ROOT}/remotion/
    :renderer;每次运行时都会复制到
    ~/.ai-video-editor/remotion
    。