失败处理(核心规则)
sub-agent task 失败后,永远不要在主 session 自己接管本应由 sub-agent 做的工作。
正确做法:
- 分析失败原因(task return 值 / 错误信息)
- 如可修复:用修正后的参数重新派发同一 sub-agent
- 如不可修复:将失败原因和已尝试方案返回给用户,停止流程
错误做法:
- ❌ "sub-agent 失败了,我自己来写这个 novel.md"
- ❌ "task 报错了,我在主 session 直接调用 Write"
- ❌ "我 fallback 一下,自己生成 keyframes.json"
原因:主 session 缺少 sub-agent 的隔离上下文(专属 system prompt、skill 加载、permission 配置),自己接管会导致质量下降、跨步骤上下文污染、permission 错配等问题。即使 sub-agent 失败,工作所有权也必须留在 sub-agent 层。
使用示例
/generate-video ep01
/generate-video ep01 镜头3 镜头5
/generate-video ep03 镜头1-镜头8
约束
- 严禁自行编写脚本(包括 Python、Node.js、内联 bash 脚本等)。只能调用插件内
scripts/目录下的现有脚本。 - tasks.json 的读取和写入由你(LLM)直接完成:用 Read 工具读取,用 Write 工具写入。不要用脚本操作 tasks.json。
- 调用插件脚本时,如果相对路径
scripts/xxx.sh找不到,使用 Glob 工具搜索**/scripts/xxx.sh找到插件目录下的脚本绝对路径。 - 提交视频生成任务的唯一入口是
creator-video-dreaminaskill(仅处理 pending shot);本 skill 不得在预登记以外直接调 dreamina CLI 提交任何任务(包括测试、验证、调试用途)。 - 预登记阶段是本 skill 更新 tasks.json 中 prompt / images / duration 字段的唯一时机;完成预登记后进入提交阶段,不得再改这些字段。
流程
阶段 1: 配置检查
- 使用 Bash 调用
bash scripts/read-config.sh "视频模型"获取视频模型值 - 若视频模型为
none→ 进入视频模型交互式配置流程: a. 询问视频模型:A) none B) dreamina b. 若选择 none → 提示"已取消"并结束 c. 若选择 dreamina → 继续询问:- 即梦视频模型版本:A) seedance2.0fast(推荐) B) seedance2.0 C) seedance2.0fast_vip D) seedance2.0_vip
- 视频比例:A) 16:9(推荐) B) 9:16 C) 1:1 D) 其他
- 视频分辨率:A) 720p(当前仅支持 720p)
d. 使用 Edit 更新 config.md:将
视频模型: none改为视频模型: dreamina,追加## 视频生成配置区域
阶段 2: 解析参数
- 从
$ARGUMENTS[0]获取集数(如ep01) - 从
$ARGUMENTS[1..]获取可选的镜头列表(如镜头3 镜头5) - 读取
story/episodes/{集数}/storyboard.md - 解析分镜中的所有镜头(
### 镜头 N块) - 若指定了镜头 → 过滤出目标镜头;否则使用全部镜头
阶段 3: 前置检查
- 从每个目标镜头的
**引用资产:**行提取所有资产链接 - 使用 Bash 调用
bash scripts/asset-to-image-path.sh "{资产路径}"转换为图片路径 - 使用 Glob 检查每个图片是否存在
- 若有缺失 → 列出缺失清单,提示用户先生成图片(使用
/series-edit-story 重新生成XXX的参考图片或确保图像模型已配置),结束 - 全部存在 → 继续
阶段 4: 预登记到 tasks.json
- 使用 Bash 执行
mkdir -p story/episodes/{集数}/videos - 使用 Read 读取
story/episodes/{集数}/videos/tasks.json(不存在视为空数组[]) - 对每个目标镜头:
a. 使用 Bash 调用
bash scripts/storyboard-to-prompt.sh "story/episodes/{集数}/storyboard.md" {镜头编号}获取 prompt / images / duration b. 查找 tasks.json 中是否存在该 shot 记录:- 不存在 → 添加
{shot: N, submit_id: "", status: "pending", prompt, images, duration, fail_reason: ""} - status == pending → 用新值刷新 prompt / images / duration(保持 status 为 pending)
- status ∈ {submitted, done, failed} → 用新值刷新 prompt / images / duration,保持 status 不变。若 prompt / images / duration 中任一与原值不同 → 输出警告行:
⚠️ shot {N}:storyboard 已变更,tasks.json 中 prompt/images/duration 已刷新,但视频状态仍为 {status},未自动重提。后续行为按 status 不同:若 status=submitted,当前用旧 prompt 在 dreamina 排队,最终成功则视频丢失编辑(强制重生成需等查询完成后手删 mp4 + tasks.json 条目重跑 /generate-video),最终失败则下次 /check-video --auto 用新 prompt 重提;若 status=done,不会自动重提(需手删 shot{NN}.mp4 + tasks.json 条目后重跑 /generate-video);若 status=failed,下次 /check-video --auto 若分类为 retryable(如并发限制、临时网络错误)则自动用新 prompt 重试无需手删,若分类为 human-needed(如内容安全、参数错误)则需 /check-video 交互模式介入或手删条目重跑。
- 不存在 → 添加
- 使用 Write 把完整 JSON 数组写回 tasks.json(保留非目标 shot 的记录不动)
- 统计本次需要提交的镜头 = 此时 status 为 pending 的目标镜头。若为空 → 输出"无 pending 镜头,无需提交"并跳到阶段 7
阶段 5: 提交任务
- 读取
config.md获取视频模型值 - 使用 Skill tool 调用
creator-video-{视频模型值}skill,传递参数:{集数} {目标 pending 镜头编号列表,如 "1 3 5" 或 "all"}
阶段 6: 启动自动监控
- 使用 Skill tool 调用
auto-videoskill,传递参数:{集数} 1200
阶段 7: 完成
- 输出提交摘要