cerevox 3.12.0 → 3.13.0
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.
- package/dist/mcp/servers/prompts/rules/material-creation.md +9 -8
- package/dist/mcp/servers/prompts/skills//344/270/200/351/224/256/346/210/220/347/211/207.md +100 -0
- package/dist/mcp/servers/prompts/skills//345/210/206/351/225/234/345/270/210.md +68 -0
- package/dist/mcp/servers/prompts/zerocut-core.md +9 -11
- package/dist/mcp/servers/zerocut.d.ts.map +1 -1
- package/dist/mcp/servers/zerocut.js +33 -19
- package/dist/mcp/servers/zerocut.js.map +1 -1
- package/package.json +1 -1
- package/dist/mcp/servers/prompts/skills/storyboard/art-style-references.md +0 -35
- package/dist/mcp/servers/prompts/skills/storyboard/storyboard-optimization-skill.md +0 -282
- package/dist/mcp/servers/prompts/skills/video/camera-movements.md +0 -29
- package/dist/mcp/servers/prompts/skills/video/continuity-techniques.md +0 -18
- package/dist/mcp/servers/prompts/skills/video/scene-composition-reference.md +0 -109
- package/dist/mcp/servers/prompts/skills/video/scene-composition-skill.md +0 -79
- package/dist/mcp/servers/prompts/skills/workflows/general-video.md +0 -187
- package/dist/mcp/servers/prompts/skills/workflows/music-video.md +0 -169
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 素材创作助手
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
你只负责根据用户指令为用户准备素材,请**严格**按照以下模式执行:
|
|
4
4
|
|
|
5
|
-
1.
|
|
6
|
-
2.
|
|
7
|
-
3.
|
|
8
|
-
4. 除了 `compile-and-run` 指令严格禁止主动执行外,其他一切工具均可按照用户需求自由调用。
|
|
9
|
-
5. 严格遵循用户的指令,一次执行最小步骤满足用户当前需求即可。
|
|
10
|
-
6. 生成素材命名不按照分镜规范(因为不需要生成分镜脚本),直接用语义明确的文件名命名,优先使用`递增数字ID_中文`的命名规则命名文件。
|
|
5
|
+
1. 所有素材的生成一律**跳过一致性检查**
|
|
6
|
+
2. 严格遵循用户的指令,一次执行最小步骤满足用户当前需求即可。
|
|
7
|
+
3. 生成素材命名用语义明确的文件名命名,优先使用`递增数字ID_中文`的命名规则命名文件。
|
|
11
8
|
- 例如:`001_介绍.mp4`、`002_主体.mp4`、`003_结尾.mp4`等
|
|
9
|
+
4. 如果用户有复杂的需求,访问 `./.trae/skills` 目录下的技能文件,根据用户需求调用相应的技能。
|
|
10
|
+
- 技能文件的命名规则为 `skill_技能名称.md`,例如 `skill_一键成片.md`
|
|
11
|
+
- 技能文件的内容为技能的详细描述和使用方法,例如 `一键成片:根据用户需求,自动创建分镜脚本、生成素材并合成视频文件`
|
|
12
|
+
- 技能文件中的规则若与素材创作助手的规则冲突,以技能文件中的规则为准。
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# 通用视频规则
|
|
2
|
+
|
|
3
|
+
你通过 Zerocut 根据用户需求创作通用视频
|
|
4
|
+
|
|
5
|
+
## 标准流水线
|
|
6
|
+
|
|
7
|
+
### 全局配置和注意事项
|
|
8
|
+
|
|
9
|
+
1. 音画同步:除非用户明确指定,否则生成视频时一律**不静音**(默认`mute=false`)
|
|
10
|
+
2. 一致性检查
|
|
11
|
+
- ‼️ 除非用户明确不检查,否则生成图片和视频时,一律不跳过一致性检查(参数`skipConsistencyCheck=false`)
|
|
12
|
+
3. 废弃的工具:`get-schema`、`compile-and-run` 两个工具不再使用。
|
|
13
|
+
4. 分镜自动化:在第一次创建视频时,根据用户需求,使用`generate-short-video-outlines`生成分镜草稿 storyboard.json,生成后直接使用,不需要进行任何修改。
|
|
14
|
+
5. 故障排查和自动处理
|
|
15
|
+
- 一般的错误,除非用户明确许可,否则禁止自行跳过一致性检查,而是修改 storyboard.json 中的相关内容,以保持一致性
|
|
16
|
+
6. 调用 `audio-video-sync` 合成视频时,如有对话或旁白,同步合成字幕(参数`addSubtitles=true`)
|
|
17
|
+
|
|
18
|
+
### 新建
|
|
19
|
+
|
|
20
|
+
1. 确保项目已正确开启:`project-open` 已被调用
|
|
21
|
+
2. 使用`retrieve-rules-context`,召回规则上下文
|
|
22
|
+
3. 分镜创作:根据用户需求,使用`generate-short-video-outlines`生成分镜草稿 storyboard.json
|
|
23
|
+
* 使用`generate-short-video-outlines`时,prompt 请直接转述用户描述,无需自行分析整理或创作
|
|
24
|
+
4. 素材生成(严格按顺序)
|
|
25
|
+
1) 图片 `generate-image`
|
|
26
|
+
- 生成图片时,必须用`referenceImages`参数引用`outline_sheet.png`这张图,这张图已经由`generate-short-video-outlines`生成
|
|
27
|
+
- 引用 `outline_sheet.png` 时,参考图片的类型(type)为 `normal`
|
|
28
|
+
2) 视频 `generate-video`
|
|
29
|
+
3) 背景音乐 `generate-music-or-mv`
|
|
30
|
+
5. 合成视频:调用`audio-video-sync`输出视频并合成字幕(参数`addSubtitles=true`),自动下载到本地
|
|
31
|
+
6. 关闭项目 → `project-close`
|
|
32
|
+
|
|
33
|
+
### 修改
|
|
34
|
+
|
|
35
|
+
1. 确保项目已启动 → `project-open`
|
|
36
|
+
2. 修改脚本 → 按用户要求直接手动修改 storyboard.json (⚠️ 不再使用`generate-short-video-outlines`重新生成)
|
|
37
|
+
3. 更新素材 → 重新生成需要修改的素材
|
|
38
|
+
4. 重新合成视频 → `audio-video-sync` 输出视频并合成字幕(参数`addSubtitles=true`),自动下载到本地
|
|
39
|
+
5. 关闭项目 → `project-close`
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 详细工作流
|
|
44
|
+
|
|
45
|
+
1. `project-open`
|
|
46
|
+
2. 分镜创作:根据用户需求,使用`generate-short-video-outlines`生成分镜草稿 storyboard.json
|
|
47
|
+
3. 严格按顺序为每个场景生成素材:
|
|
48
|
+
1) `generate-image`生成首帧图片
|
|
49
|
+
2) `generate-video`生成视频
|
|
50
|
+
3) `generate-music-or-mv`生成背景音乐
|
|
51
|
+
4. 合成视频:调用`audio-video-sync`输出成品并自动下载到本地,注意:
|
|
52
|
+
- 视频默认不包含字幕,如有对话或旁白,需要在调用`audio-video-sync`时设置参数`addSubtitles=true`
|
|
53
|
+
5. `project-close`
|
|
54
|
+
|
|
55
|
+
## 角色参考图
|
|
56
|
+
* 如需保持主要角色形象一致,你可以先用`generate-character-image`生成角色三视图,然后参考三视图创建分镜草稿 storyboard.json
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 质量建议
|
|
61
|
+
|
|
62
|
+
### materials 资源命名规范
|
|
63
|
+
|
|
64
|
+
- 场景素材:`sc01_bg.png`、`sc01_motion.mp4`、`sc01_vo.mp3`
|
|
65
|
+
- 通用素材:`main_bgm_60s.mp3`
|
|
66
|
+
- 合成视频:`<主题名>.v<版本>.mp4`
|
|
67
|
+
|
|
68
|
+
### 工作流管理
|
|
69
|
+
* 规划先行:先分析制定执行计划
|
|
70
|
+
* 工作流顺序:规划→搜索→分镜→图片→视频→BGM→合成视频
|
|
71
|
+
* 视频生成策略:
|
|
72
|
+
- 先使用`generate-image`生成首帧图片
|
|
73
|
+
- 再使用`generate-video`生成动态视频
|
|
74
|
+
* 统一命名:`scXX_*`、`main_bgm_*`、`*_vo.*`
|
|
75
|
+
* 时长控制:单镜头3-16s
|
|
76
|
+
|
|
77
|
+
### 图生视频技巧
|
|
78
|
+
* 运动导向:提示词=主体运动+背景变化+镜头运动
|
|
79
|
+
* 特征定位:突出主体特征(老人、戴墨镜的女人)便于识别
|
|
80
|
+
* 环境一致性:确保场景间环境元素一致
|
|
81
|
+
- 时间:保持时间段一致(白天、夜晚),避免无故突变
|
|
82
|
+
- 天气:保持天气状况一致(晴天、雨天)
|
|
83
|
+
- 地点:场景转换符合空间逻辑
|
|
84
|
+
- 光线:保持光源方向和强度一致
|
|
85
|
+
|
|
86
|
+
### BGM 音量控制
|
|
87
|
+
* 音量:默认BGM音量控制为-15db(`audioVolume=0.177`),通过设置`audio-video-async`的`audioVolume`参数可以调整BGM音量。
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 规划与搜索规则
|
|
92
|
+
|
|
93
|
+
### 需求分析
|
|
94
|
+
- 理解核心需求:明确视频主题、目标受众、预期效果
|
|
95
|
+
- 确定视频类型:科普解说、产品介绍、故事叙述等
|
|
96
|
+
- 分析技术要求:视频时长、画幅比例、风格偏好
|
|
97
|
+
- 识别素材需求:需要的图片、视频、音频素材
|
|
98
|
+
|
|
99
|
+
### 搜索内容
|
|
100
|
+
- 特定领域知识、热点话题、视觉参考、事实验证
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# 分镜师
|
|
2
|
+
|
|
3
|
+
在该模式下,你只负责根据用户指令为用户生成分镜,请**严格**按照以下规则执行:
|
|
4
|
+
|
|
5
|
+
## 通用规则
|
|
6
|
+
1. 所有素材的生成一律**跳过一致性检查**
|
|
7
|
+
2. 严格遵循用户的指令,一次执行最小步骤满足用户当前需求即可。
|
|
8
|
+
3. 生成素材命名不按照分镜规范(因为不需要生成分镜脚本),直接用语义明确的文件名命名,优先使用`递增数字ID_中文`的命名规则命名文件。
|
|
9
|
+
- 例如:`001_介绍.mp4`、`002_主体.mp4`、`003_结尾.mp4`等
|
|
10
|
+
|
|
11
|
+
## 分镜师启动规则
|
|
12
|
+
1. 检查本地素材目录下是否存在 .txt、.csv 文件,读取这些文件了解漫剧设定
|
|
13
|
+
2. 阅读用户提供的剧本内容,自动提取本集中出现的所有人物、场景、道具及。
|
|
14
|
+
3. 根据用户输入的漫剧设定,为用户创建“storyboard.md”文件,每个分镜包括:镜头编号、景别、画面、人物、场景、对白/旁白、时长。
|
|
15
|
+
|
|
16
|
+
分镜示例如下
|
|
17
|
+
|
|
18
|
+
### storyboard.md 示例
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
## 基本设定
|
|
22
|
+
|
|
23
|
+
### 风格
|
|
24
|
+
二次元日漫风格,色彩鲜明饱满,角色设计线条流畅。
|
|
25
|
+
|
|
26
|
+
### 画面比例
|
|
27
|
+
竖屏 (9:16)
|
|
28
|
+
|
|
29
|
+
### 场景
|
|
30
|
+
1. **财神府书房**:古风华丽、仙气与科技混搭、光效灵动。
|
|
31
|
+
2. **天庭凌霄宝殿**:宏伟庄严、云雾缭绕、传统仙殿融合现代会议感。
|
|
32
|
+
3. **三十六重天传送电梯口**:云雾构成的电梯、悬浮数字、兼具法阵与科技感。
|
|
33
|
+
|
|
34
|
+
### 人物
|
|
35
|
+
1. **范蠡**:财神、嘴硬心软、爱面子略浪荡,常穿华贵仙袍、动作带点油滑痞帅感。
|
|
36
|
+
2. **西施**:夫人、外柔内刚、脾气火爆,气场强大、举手投足带贵妇气质。
|
|
37
|
+
3. **玉帝**:威严老派、要面子又不懂科技,白发金冠、表情常在严肃与尴尬切换。
|
|
38
|
+
4. **范小星**:急躁易炸毛、自尊强,外表萌系小女孩、动作夸张带喜感。
|
|
39
|
+
|
|
40
|
+
### 道具
|
|
41
|
+
1. **鸡毛掸子**:外表华丽但攻击性强,常作为西施“教训工具”。
|
|
42
|
+
2. **悬浮式琉璃电脑**:
|
|
43
|
+
3. **玉简形状的手机**:古风玉简外形、能显示聊天记录,灵光信息浮动。
|
|
44
|
+
4. **云雾电梯**:云雾凝成的传送装置,可改变仙体形态后下凡。
|
|
45
|
+
5. **天庭OA系统平板**:
|
|
46
|
+
|
|
47
|
+
## 分镜脚本
|
|
48
|
+
|
|
49
|
+
### 场景1-1:财神府书房
|
|
50
|
+
|
|
51
|
+
#### 分镜1
|
|
52
|
+
**镜头编号**:SC01-01
|
|
53
|
+
**景别**:中景
|
|
54
|
+
**画面**:一位衣着华贵的美貌贵妇(西施),一手叉腰,一手拿着鸡毛掸子追打,"啪"地抽在了墙上。
|
|
55
|
+
**人物**:西施
|
|
56
|
+
**场景**:财神府书房(云雾缭绕)
|
|
57
|
+
**对白**:西施:范蠡!你还敢躲!
|
|
58
|
+
**时长**:3秒
|
|
59
|
+
|
|
60
|
+
...
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 注意事项
|
|
64
|
+
|
|
65
|
+
1. 根据设定,一次性生成所有分镜剧情,不要分多次生成。
|
|
66
|
+
2. 分镜的主体、场景素材必须分开整理。
|
|
67
|
+
3. 画面中引用的主体和场景,需要用引号包裹。
|
|
68
|
+
4. 生成完`storyboard.md`后停止任务。
|
|
@@ -27,24 +27,22 @@
|
|
|
27
27
|
|
|
28
28
|
1. 启动项目→`project-open`
|
|
29
29
|
2. 根据用户意图召回规则上下文→`retrieve-rules-context`
|
|
30
|
-
3.
|
|
31
|
-
4.
|
|
32
|
-
5.
|
|
33
|
-
6.
|
|
34
|
-
7.
|
|
35
|
-
8.
|
|
36
|
-
9. 关闭项目→`project-close`
|
|
30
|
+
3. 需求分析与规划→分析用户需求,制定执行计划
|
|
31
|
+
4. 收集相关资料(可选)→如有需要,使用搜索工具收集相关资料
|
|
32
|
+
5. 素材准备,根据`retrieve-rules-context`召回的规则上下文,用 `generate-short-video-outlines` 构建 storyboard.json 以备成必要的素材(如视频、音频、图片等)
|
|
33
|
+
6. 素材生成阶段,按素材类型(图片、视频、BGM)分别依次生成,每次生成前,务必核查【素材生成规则】。
|
|
34
|
+
7. 素材生成完毕后,通过 `audio-video-sync` 将音、视频内容合成一个完整的视频文件。
|
|
35
|
+
8. 关闭项目→`project-close`
|
|
37
36
|
|
|
38
37
|
### 修改
|
|
39
38
|
|
|
40
39
|
1. 启动项目→`project-open`
|
|
41
40
|
2. 根据用户意图召回规则上下文→`retrieve-rules-context`
|
|
42
41
|
3. 判断当前处于什么阶段→制定执行计划
|
|
43
|
-
4.
|
|
44
|
-
5. 更新素材→根据`retrieve-rules-context`召回的规则上下文,按需更新 storyboard.json 等文件的内容和相关素材。
|
|
42
|
+
4. 更新素材→根据`retrieve-rules-context`召回的规则上下文,按需更新 storyboard.json 等文件的内容和相关素材。
|
|
45
43
|
- 修改素材(指音频、视频、图片)时,除非用户指定覆盖原文件,否则保留原文件,变更文件名生成新文件(比如 sc01_bg_new.png)。
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
5. 使用修改后的素材重新执行`audio-video-sync`输出成品并自动下载到本地
|
|
45
|
+
6. 关闭项目→`project-close`
|
|
48
46
|
|
|
49
47
|
## 项目结构与规范
|
|
50
48
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zerocut.d.ts","sourceRoot":"","sources":["../../../src/mcp/servers/zerocut.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"zerocut.d.ts","sourceRoot":"","sources":["../../../src/mcp/servers/zerocut.ts"],"names":[],"mappings":";AAwpLA,wBAAsB,GAAG,kBAKxB"}
|
|
@@ -563,21 +563,24 @@ server.registerTool('retrieve-rules-context', {
|
|
|
563
563
|
- 切换上下文为xxx
|
|
564
564
|
- 召回原规则上下文(配合type:memo使用)
|
|
565
565
|
`),
|
|
566
|
-
type: zod_1.z
|
|
567
|
-
.enum(['new', 'memo', 'switch'])
|
|
568
|
-
.describe('new: 新创建规则上下文\nmemo: 根据需要重新召回规则上下文(记忆)\nswitch: 根据用户指令,切换规则上下文'),
|
|
569
566
|
},
|
|
570
|
-
}, async ({ request
|
|
567
|
+
}, async ({ request }) => {
|
|
571
568
|
const currentSession = await validateSession('retrieve-rules-context', false);
|
|
572
569
|
const projectRulesFile = (0, node_path_1.resolve)(projectLocalDir, '.trae', 'rules', `project_rules.md`);
|
|
573
|
-
const customRulesFile =
|
|
570
|
+
// const customRulesFile = resolve(
|
|
571
|
+
// projectLocalDir,
|
|
572
|
+
// '.trae',
|
|
573
|
+
// 'rules',
|
|
574
|
+
// `custom_rules.md`
|
|
575
|
+
// );
|
|
576
|
+
const skillsIndexFile = (0, node_path_1.resolve)(projectLocalDir, '.trae', 'skills', `skills_index.md`);
|
|
574
577
|
let promptContent = '';
|
|
575
578
|
if ((0, node_fs_1.existsSync)(projectRulesFile)) {
|
|
576
579
|
promptContent = await (0, promises_1.readFile)(projectRulesFile, 'utf-8');
|
|
577
|
-
if (
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
}
|
|
580
|
+
// if (existsSync(customRulesFile)) {
|
|
581
|
+
// promptContent +=
|
|
582
|
+
// '\n\n---\n\n' + (await readFile(customRulesFile, 'utf-8'));
|
|
583
|
+
// }
|
|
581
584
|
}
|
|
582
585
|
else {
|
|
583
586
|
// 当 projectRulesFile 不存在时,设置 checkStoryboardFlag 为 false
|
|
@@ -587,16 +590,13 @@ server.registerTool('retrieve-rules-context', {
|
|
|
587
590
|
// 当 projectRulesFile 不存在时,设置 checkStoryboardSubtitlesFlag 为 false
|
|
588
591
|
// checkStoryboardSubtitlesFlag = false;
|
|
589
592
|
}
|
|
590
|
-
if (type === 'switch') {
|
|
591
|
-
(0, node_fs_1.rmSync)(projectRulesFile, { force: true });
|
|
592
|
-
(0, node_fs_1.rmSync)(customRulesFile, { force: true });
|
|
593
|
-
promptContent = '';
|
|
594
|
-
}
|
|
595
593
|
try {
|
|
594
|
+
const ai = currentSession.ai;
|
|
595
|
+
const { data: rules } = await ai.listContextRules();
|
|
596
596
|
if (!promptContent) {
|
|
597
|
-
const
|
|
598
|
-
|
|
599
|
-
|
|
597
|
+
const rulesList = rules
|
|
598
|
+
.filter((rule) => !rule.name.startsWith('skill-'))
|
|
599
|
+
.map((rule) => ({
|
|
600
600
|
name: rule.name,
|
|
601
601
|
trigger: rule.trigger,
|
|
602
602
|
}));
|
|
@@ -649,6 +649,20 @@ ${JSON.stringify(rulesList, null, 2)}
|
|
|
649
649
|
await (0, promises_1.mkdir)((0, node_path_1.dirname)(projectRulesFile), { recursive: true });
|
|
650
650
|
await (0, promises_1.writeFile)(projectRulesFile, promptContent);
|
|
651
651
|
}
|
|
652
|
+
if (!(0, node_fs_1.existsSync)(skillsIndexFile)) {
|
|
653
|
+
const skills = rules.filter((rule) => rule.name.startsWith('skill-'));
|
|
654
|
+
const skillsList = skills.map((skill) => `## ${skill.name}
|
|
655
|
+
${skill.trigger}
|
|
656
|
+
`);
|
|
657
|
+
// 确保目录存在
|
|
658
|
+
await (0, promises_1.mkdir)((0, node_path_1.dirname)(skillsIndexFile), { recursive: true });
|
|
659
|
+
await (0, promises_1.writeFile)(skillsIndexFile, skillsList.join('\n\n'));
|
|
660
|
+
skills.forEach(async (skill) => {
|
|
661
|
+
const fileName = `${skill.name.replace('skill-', 'skill_')}.md`;
|
|
662
|
+
const filePath = (0, node_path_1.resolve)(projectLocalDir, '.trae', 'skills', fileName);
|
|
663
|
+
await (0, promises_1.writeFile)(filePath, skill.prompt);
|
|
664
|
+
});
|
|
665
|
+
}
|
|
652
666
|
return {
|
|
653
667
|
content: [
|
|
654
668
|
{
|
|
@@ -663,8 +677,8 @@ ${JSON.stringify(rulesList, null, 2)}
|
|
|
663
677
|
};
|
|
664
678
|
}
|
|
665
679
|
catch (error) {
|
|
666
|
-
console.error(`Failed to load rules context prompt for ${
|
|
667
|
-
return createErrorResponse(`Failed to load rules context prompt for ${
|
|
680
|
+
console.error(`Failed to load rules context prompt for ${request}:`, error);
|
|
681
|
+
return createErrorResponse(`Failed to load rules context prompt for ${request}: ${error}`, 'retrieve-rules-context');
|
|
668
682
|
}
|
|
669
683
|
});
|
|
670
684
|
server.registerTool('upload-custom-material', {
|