内容分四块: 1、产品规划产出 —— MCN 短视频整合营销工作台的①段五份(1a 需求/1b 竞品/1c 画像/1d 策略/1e 场景)、②段两份(2a 功能/2b 布局)、③段界面(DESIGN.md 契约与令牌表 + mcn-workbench.html 原型 + 实测/会诊/审查三份 + 23 张闸门截图)。 2、开源竞品调研 —— 5 个内容工作台项目的取证原始件与 1b 系列分析文档。 3、参考资料 —— 竞品视频抽帧 1145 张 + 2 个源视频 + 功能点截图。 4、机制侧 —— 协作脚本与状态台账、工作区记忆日志、抽帧/OCR 脚本。 .gitignore 只排运行时日志、脚本备份副本与一次性探针输出,其余按原样入库。
8.4 KiB
Easel SKILL 接口规范 v0.3
所有 Easel SKILL 遵循此规范。SKILL 是独立可调的原子能力单元。
目录结构
skills/
├── openclaw/ 五层 SKILL(发现/策划/制作/发布/归因),由 OpenClaw 直接执行
└── shared/ 跨 SKILL 共享工具(脚本、配置、依赖)
每个 SKILL 是一个独立目录:
skill-xxx/
├── SKILL.md 必须 — 执行流程(精简,< 200 行)
├── references/ 可选 — 领域知识(按需加载,不常驻 prompt)
│ └── *.md
├── scripts/ 可选 — 可执行脚本(运行时调用,代码不进 prompt)
│ └── *.py / *.sh
└── tests/ 可选 — 测试用例
├── test1.prompt 输入
└── test1.expected 期望输出(关键字匹配)
三层加载机制
| 层 | 内容 | 加载时机 | token 开销 |
|---|---|---|---|
| Metadata | frontmatter(name, description) | 常驻,用于 SKILL 路由 | 极小 |
| Instructions | SKILL.md 主体 | SKILL 被触发时 | 中等 |
| Resources | references/ + scripts/ | SKILL 执行中按需读取 | 按需 |
核心原则:SKILL.md 只写"怎么做",领域知识写在 references/ 里。
共享工具层
skills/shared/ 存放多个 SKILL 共用的工具脚本和配置(如 ffmpeg 封装、API client、通用模板)。SKILL 通过相对路径引用。
SKILL.md 格式
---
name: skill-xxx
description: >-
用中文说明本 SKILL 做什么、用户在什么场景或用哪些说法时应触发,以及与相邻 SKILL 的边界。
layer: discover / plan / produce / publish / attribute / general
---
# SKILL 名称
> 一句话描述
## 输入
描述接受什么输入
## 输出
描述输出格式(字段说明,不写具体值)
## 执行步骤
1. 步骤(引用 references/ 下的文件获取领域知识)
2. ...
## Profile 感知
有 Profile 时怎么用,没有时怎么退
frontmatter 规则:
- 只保留
name、description、layer三个常规字段,减少常驻路由上下文和无效元数据 description是 Agent 的主要触发依据,必须用中文同时写清能力、触发场景/用户说法和相邻 SKILL 边界;可使用 YAML 块标量layer标明所属层:五个流水线层discover / plan / produce / publish / attribute,外加general(跨切面基础设施,如画像管理、产物管理、模板库——不属于任一流水线阶段)- 仅在 OpenClaw 需要判断操作系统、二进制、环境变量或安装方式时,允许增加
metadata.openclaw运行时清单 - 禁止
version、profile_aware、self_developed、普通metadata.trigger/impl/source、allowed-tools、tags;来源信息放EASEL-META.md,执行约束和 Profile 行为写正文 - SKILL.md 主体控制在 200 行以内
全库校验:
python scripts/validate_skills.py
python scripts/validate_skill_commands.py
第一条检查 frontmatter、资源链接、输出和发布安全契约;第二条解析 Skill 中的 Python 命令,对照脚本的 argparse 定义检查路径与参数漂移。
调用方式
easel skill check-compliance -i "内容"
easel skill check-compliance -i "内容" -p 画像名
所有调用统一走 OpenClaw agent,由 OpenClaw 读对应 SKILL、按 AGENTS.md 规则自己执行。
SKILL 同步
openclaw/sync.sh 把 skills/openclaw/ 与 skills/shared/ 同步到 ~/.openclaw/workspace-easel/。
Profile 注入
- OpenClaw 直接读取 Profile 文件夹,按 AGENTS.md 凝练后用于产出。
- 检测标记:
=== EASEL ACCOUNT PROFILE ===
产物管理
目录布局规约(一个内容项目 = outputs/<主题>/ 一个目录):
outputs/<主题>/
├── note.md / final.mp4 / card_1.png 成品(用户要发/读的最终文件,放项目根)
├── assets/ 中间件:frames/ clips/ 构建脚本 原始素材 草稿 重复文件
└── .easel.json 唯一元数据:展示头 + 层间产物契约(隐藏)
- 成品放项目根、中间件进
assets/:前端「内容库」据此把成品与素材分区展示。 - 项目名用人类可读主题(中文可),禁泛名(xhs/test);测试/临时产物写
outputs/_scratch/。 - 任何新脚本在创建产物前必须调用
skills/shared/scripts/output_paths.py的validate_output_path();系统写入需显式传allow_system=True,且只能使用已注册的_路径。 - 系统状态一律
_前缀目录(_login/_publish/_analytics/_profile_build/_scratch); 内容库只展示项目目录,忽略根目录散文件与系统目录。
元数据契约(.easel.json)
单一元数据文件(隐藏),由 skills/shared/scripts/manifest.py 读写(带 selftest),含两部分:
① 展示头(供前端「内容库」富展示:标题/平台/状态/封面/标签 + 成品高亮)。收尾登记:
python skills/shared/scripts/manifest.py meta --topic <主题> \
--title "<人类可读标题>" --platform 小红书 --kind cards --status draft \
--tags "标签1,标签2" --cover cover.png --deliverables card_1.png,card_2.png
kind 取 article/xhs-note/video/cards/poster/audio/other;status 取 draft/ready/published。
meta 为 upsert:只改传入字段、其余保留;缺省有兜底(title→topic、cover→首张成品媒体)。
② 层间产物契约 steps[]:纵向编排跨层时,上游产物路径与关键结论通过 manifest 结构化传递,下游无需重新推导。
# 上游每步产出后登记(失败也登记 --status failed,供断点续跑)
python skills/shared/scripts/manifest.py record --topic <主题> \
--layer plan --skill video-script --profile <画像> \
--outputs script.md,brief.md --summary "3 幕结构,钩子在前 3s"
# 下游步骤前取上游最近一步作为输入
python skills/shared/scripts/manifest.py latest --topic <主题> [--layer plan]
python skills/shared/scripts/manifest.py read --topic <主题> # 看全链路
Schema:{topic, profile, created, updated, title, summary, platform, kind, status, tags[], cover, deliverables[], steps:[{layer, skill, at, status, outputs[], upstream[], summary}]}。
layer 取 discover/plan/produce/publish/attribute/general;step status 取 done/failed(默认 done)。契约稳定、可被任一层消费。
存量目录用
scripts/migrate_outputs.py(dry-run→apply 回填展示头,--reorganize归整中间件进 assets/)收敛;测试残渣用scripts/cleanup_outputs.sh清理。
出站内容安全闸门(发布/评论类 SKILL 契约)
任何把文本发到公开平台的脚本(xhs/douyin/web_publisher/xhs_comment/zhihu_answer 等),在真发(--exec)前必须过 skills/shared/scripts/content_guard.py 的 guard_or_die(...)。分两级(见 BLOCK_CATEGORIES):BLOCK 级=真·敏感信息(API key、内部 URL/域名、代理 IP、内部路径、env 名 + .env 真值)→ fail-closed 退出码 7 阻止发布;WARN 级=AI 措辞(由 AI 生成/OpenClaw/Claude/system prompt/大模型)与模型名(claude-*/gpt-image-2)→ 论文解读、AI 科普里可能是正常内容,只提醒不拦截。dry-run 全部只告警。放行硬拦须显式 --allow-unsafe。新增发布类脚本照此接入。
有界编排约定:manifest 只当薄索引(summary 一行给编排层路由 + outputs[] 指路径),不复制内容。跨层要传的东西分两类,都落 outputs/<主题>/ 成文件,不留在对话里:
- 产物(载荷):脚本/图/视频/文案 → 写文件,
--outputs指过去,下游按路径读全文。 - 决策/意图(基调、受众、钩子、do/don't 等不体现在产物里的)→ 写进
outputs/<主题>/brief.md(策划层的创作简报),同样列入--outputs。
测试
SKILL 可带 tests/ 目录,用低成本模型验证基本功能:
test1.prompt— 测试输入test1.expected— 期望输出关键字/pattern
设计约束
- 独立可调 — 不依赖其他 SKILL
- 无 Profile 也能用 — Profile 是加持不是前提
- 接口一致 — 输出格式稳定,可被下游消费
- SKILL.md 精简 — 执行流程在主文件,领域知识放 references/
- 泛化 — 定义规则和模式,不给具体 case 示例