安全扫描
OpenClaw
可疑
medium confidence技能的 manifest 驱动 FFmpeg 合成流程与其描述基本匹配,但运行时指令允许执行 manifest 中任意预命令,且 SKILL.md 假定外部二进制(ffmpeg、yq、shell)却未在元数据中声明,此差异及可执行 manifest 指定命令是主要风险点。
评估建议
该技能确实能按声明用 FFmpeg 合成媒体,但需谨慎:manifest 格式包含 components[].requires 字段,指令会运行 shell 命令及外部工具(ffmpeg、yq)。运行前请确认 manifest 来源可信并审查任何 'requires' 命令;确保 ffmpeg 与 yq 装在受控环境或于沙箱/容器内运行。建议作者:①在元数据声明所需二进制;②限制或净化 manifest 'requires' 执行;③文档化安全验证规则。若无法信任 manifest,切勿运行将执行它的合成任务。...详细分析 ▾
ℹ 用途与能力
名称/描述(合成 GIF/视频为复合素材)与指令(解析 manifest、验证文件、运行 FFmpeg)一致,但 SKILL.md 期望命令行工具(ffmpeg、yq、bash)而技能元数据未声明所需二进制,存在不一致,应补充声明。
⚠ 指令范围
运行时指令会解析用户提供的 manifest 文件并执行 components[].requires 及完整 shell ffmpeg/yq 命令,意味着 manifest 可触发任意 shell 命令(如 'requires' 条目),若未严格验证或沙箱隔离,执行代理可能运行不受信命令。
✓ 安装机制
纯指令技能,无安装规范或嵌入代码,降低安装器风险,无下载或解压步骤。
ℹ 凭证需求
未请求环境变量或凭证(良好)。技能声明需配置路径 night-market.scry:gif-generation,与父插件集成合理,但应在文档中说明访问理由;未声明所需二进制(ffmpeg、yq)属比例/准确性问题。
✓ 持久化与权限
always:false 且未请求特殊权限,技能不要求持久驻留或系统级配置更改。
安全有层次,运行前请审查代码。
运行时依赖
无特殊依赖
版本
latestv1.0.02026/4/20
媒体合成技能初始发布。 - 将 GIF、视频、图片等多媒体素材合成为教程或文档所需的复合输出。 - 支持垂直、水平、顺序、网格、叠加与画中画(PiP)布局,可自定义边距、背景等选项。 - 使用 manifest 文件定义输入组件与合成规则。 - 执行 FFmpeg 命令生成最终合成媒体。 - 提供验证、FFmpeg 命令用法及输出核查的分步指导。
● 可疑
安装命令
点击复制官方npx clawhub@latest install nm-scry-media-composition
镜像加速npx clawhub@latest install nm-scry-media-composition --registry https://cn.longxiaskill.com
技能文档
Night Market 技能 — 从 claude-night-market/scry 移植。如需完整的代理、钩子与命令体验,请安装 Claude Code 插件。
目录
- 概述
- 必需的 TodoWrite 条目
- 清单格式
- 清单模式
- 逐步流程
- 1. 解析清单文件
- 2. 验证组件输出
- 3. 执行 FFmpeg 合成
- 4. 验证合成输出
- FFmpeg 合成命令
- 竖向堆叠
- 横向堆叠
- 顺序拼接
- 网格布局(2×2)
- 带背景色
- 布局选项
- 布局选项详情
- 合成示例
- 终端 + 浏览器教程
- 并排对比
- 画中画
- 退出条件
# Media Composition 技能 将多个媒体资源(GIF、视频、图片)合成为用于详细教程与文档的复合输出。
何时使用
- 将多个媒体输出组合成合成图
- 根据终端与浏览器录制创建复合演示
何时不使用
- 无需合成的单一格式输出
- 简单终端录制 —— 直接使用 scry:vhs-recording
概述
此技能负责将分别生成的媒体资源整合为统一的输出。它读取定义组件及其合成规则的清单文件,验证所有输入存在,并执行 FFmpeg 命令以生成最终的复合媒体。必需的 TodoWrite 条目
- 解析合成清单文件
- 验证所有组件输出存在
- 确定合成布局与参数
- 执行 FFmpeg 合成命令
- 验证已创建合成输出文件
- 报告合成指标(文件大小、尺寸)
验证: 运行带 --help 标志的命令以确认可用性。清单格式
清单定义了要组合的组件及其排列方式:# 示例清单:tutorials/mcp.manifest.yaml
name: mcp
title: "MCP Server Integration"
components:
- type: tape
source: mcp.tape
output: assets/gifs/mcp-terminal.gif
- type: playwright
source: browser/mcp-browser.spec.ts
output: assets/gifs/mcp-browser.gif
requires:
- "skrills serve"
combine:
output: assets/gifs/mcp-combined.gif
layout: vertical
options:
padding: 10
background: "#1a1a2e"
验证: 运行带 --help 标志的命令以确认可用性。清单模式
| 字段 | 类型 | 必需 | 描述 |
|---|---|---|---|
name | string | 是 | 合成的标识符 |
title | string | 否 | 人类可读的标题 |
components | array | 是 | 要组合的媒体组件列表 |
components[].type | string | 是 | 源类型:tape、playwright、static |
components[].source | string | 是 | 源文件路径 |
components[].output | string | 是 | 生成输出的路径 |
components[].requires | array | 否 | 生成前需运行的命令 |
combine.output | string | 是 | 组合输出的路径 |
combine.layout | string | 是 | 布局模式(见下表) |
combine.options | object | 否 | 布局相关选项 |
逐步流程
1. 解析清单文件
# 读取并验证清单结构
yq eval '.' manifest.yaml
# 提取组件输出
yq eval '.components[].output' manifest.yaml
验证: 运行带 --help 标志的命令以确认可用性。2. 验证组件输出
# 检查所有必需文件是否存在
for output in $(yq eval '.components[].output' manifest.yaml); do
if [[ ! -f "$output" ]]; then
echo "ERROR: 缺少组件:$output"
exit 1
fi
done
验证: 运行带 --help 标志的命令以确认可用性。3. 执行 FFmpeg 合成
根据清单中指定的布局,执行相应的 FFmpeg 命令。4. 验证合成输出
# 验证输出存在且有内容
if [[ -f "$output" && -s "$output" ]]; then
echo "合成成功:$output"
ls -lh "$output"
else
echo "ERROR: 合成失败"
exit 1
fi
验证: 运行带 --help 标志的命令以确认可用性。FFmpeg 合成命令
竖向堆叠
将 GIF/视频从上到下堆叠:ffmpeg -i top.gif -i bottom.gif \
-filter_complex "[0:v][1:v]vstack=inputs=2" \
-y output.gif
验证: 运行带 --help 标志的命令以确认可用性。带间距:
ffmpeg -i top.gif -i bottom.gif \
-filter_complex "[0:v]pad=iw:ih+10:0:0:color=black[top];[top][1:v]vstack=inputs=2" \
-y output.gif
验证: 运行带 --help 标志的命令以确认可用性。横向堆叠
将 GIF/视频并排堆叠:ffmpeg -i left.gif -i right.gif \
-filter_complex "[0:v][1:v]hstack=inputs=2" \
-y output.gif
验证: 运行带 --help 标志的命令以确认可用性。顺序拼接
按顺序播放 GIF/视频:# 创建拼接列表文件
cat > concat_list.txt << EOF
file 'first.gif'
file 'second.gif'
file 'third.gif'
EOF
# 拼接
ffmpeg -f concat -safe 0 -i concat_list.txt \
-y output.gif
验证: 运行带 --help 标志的命令以确认可用性。网格布局(2×2)
ffmpeg -i tl.gif -i tr.gif -i bl.gif -i br.gif \
-filter_complex "[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2" \
-y output.gif
验证: 运行带 --help 标志的命令以确认可用性。带背景色
ffmpeg -i top.gif -i bottom.gif \
-filter_complex "color=c=#1a1a2e:s=800x600[bg];[bg][0:v]overlay=0:0[tmp];[tmp][1:v]overlay=0:300" \
-y output.gif
验证: 运行带 --help 标志的命令以确认可用性。布局选项
| 布局 | 描述 | 选项 |
|---|---|---|
vertical | 从上到下堆叠 | padding、background、align |
horizontal | 从左到右堆叠 | padding、background、align |
sequential | 按顺序播放 | transition、duration |
grid | N × M 网格排列 | rows、cols、padding |
overlay | 彼此叠加 | position、opacity |
pip | 画中画 | corner、scale、margin |
布局选项详情
| 选项 | 类型 | 默认值 | 描述 |
|---|---|---|---|
padding | int | 0 | 组件间像素间距 |
background | string | "black" | 背景色(十六进制或名称) |
align | string | "center" | 对齐:left、center、right |
transition | string | "none" | 过渡类型:fade、wipe、none |
scale | float | 0.25 | PiP 缩放因子 |
corner | string | "br" | PiP 角:tl、tr、bl、br |
合成示例
终端 + 浏览器教程
name: plugin-demo
components:
- type: tape
source: demo.tape
output: terminal.gif
- type: playwright
source: browser.spec.ts
output: browser.gif
combine:
output: demo-combined.gif
layout: vertical
options:
padding: 5
background: "#0d1117"
验证: 运行带 --help 标志的命令以确认可用性。并排对比
name: before-after
components:
- type: static
source: before.gif
output: before.gif
- type: static
source: after.gif
output: after.gif
combine:
output: comparison.gif
layout: horizontal
options:
padding: 10
验证: 运行带 --help 标志的命令以确认可用性。画中画
name: pip-demo
components:
- type: tape
source: main.tape
output: main.gif
- type: playwright
source: overlay.spec.ts
output: overlay.gif
combine:
output: pip-demo.gif
layout: pip
options:
corner: br
scale: 0.3
margin: 20
验证: 运行带 --help 标志的命令以确认可用性。退出条件
- [ ] 清单文件成功解析
- [ ] 所有组件输出验证为存在
- [ ] FFmpeg 合成命令无错误执行
- [ ] 合成输出文件存在且大小非零
- [ ] 输出尺寸与时长已记录
- [ ] 临时文件已清理
故障排除
常见问题
找不到命令 确保所有依赖已安装并在 PATH 中权限错误 检查文件权限并以适当权限运行
意外行为
使用 --verbose 标志启用详细日志