Files
WorkBuddy df56c2c137 初始化提交:contentm_agent 工作区全量快照
内容分四块:
1、产品规划产出 —— MCN 短视频整合营销工作台的①段五份(1a 需求/1b 竞品/1c 画像/1d 策略/1e 场景)、②段两份(2a 功能/2b 布局)、③段界面(DESIGN.md 契约与令牌表 + mcn-workbench.html 原型 + 实测/会诊/审查三份 + 23 张闸门截图)。
2、开源竞品调研 —— 5 个内容工作台项目的取证原始件与 1b 系列分析文档。
3、参考资料 —— 竞品视频抽帧 1145 张 + 2 个源视频 + 功能点截图。
4、机制侧 —— 协作脚本与状态台账、工作区记忆日志、抽帧/OCR 脚本。

.gitignore 只排运行时日志、脚本备份副本与一次性探针输出,其余按原样入库。
2026-10-08 08:13:02 +08:00

174 lines
8.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 格式
```markdown
---
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 行以内
全库校验:
```bash
python scripts/validate_skills.py
python scripts/validate_skill_commands.py
```
第一条检查 frontmatter、资源链接、输出和发布安全契约;第二条解析 Skill 中的 Python 命令,对照脚本的 argparse 定义检查路径与参数漂移。
## 调用方式
```bash
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),含两部分:
**① 展示头**(供前端「内容库」富展示:标题/平台/状态/封面/标签 + 成品高亮)。收尾登记:
```bash
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 结构化传递,下游无需重新推导。
```bash
# 上游每步产出后登记(失败也登记 --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
## 设计约束
1. **独立可调** — 不依赖其他 SKILL
2. **无 Profile 也能用** — Profile 是加持不是前提
3. **接口一致** — 输出格式稳定,可被下游消费
4. **SKILL.md 精简** — 执行流程在主文件,领域知识放 references/
5. **泛化** — 定义规则和模式,不给具体 case 示例