源码解析 社媒内容宿主 commit 765f5a6

不写主循环,把 OpenClaw 焊成工作台

本系列多数项目在回答「怎么让 AI 写代码」。Open Design 换了个问题:不写循环,把别人的 CLI 当引擎做设计。 Easel 坐在同一侧——循环外包给 OpenClaw,自己焊的是账号画像、112 个可执行 SKILL、项目化产物,以及真发到小红书 / 抖音 / 知乎之前的出站闸门。

112
可执行 Skill(制作层 50 个)
768
行 Python 整合包(9 个文件)
2 509
行 web/app.py(SSE / 锁 / 发布)
733
star · 仓库创建于 2026-08-28
Part 1

一张薄整合层,一座技能库,一个借来的引擎

easel/ 只有 768 行。产品不在循环里,在三件事:给 OpenClaw 喂自包含的画像前缀、让脚本把成品写进 outputs/<主题>/、真发前用确定性扫描拦住密钥。

flowchart TB
    subgraph UI["创作者看见的"]
        W["React 工作台"]
        C["easel CLI"]
    end
    subgraph HOST["Easel 宿主"]
        P["persona.py 画像前缀"]
        A["web/app.py SSE · 双锁 · uuid5"]
        G["content_guard · persona_gate"]
    end
    subgraph ENG["借来的引擎"]
        O["openclaw --profile easel"]
    end
    subgraph DISK["项目磁盘"]
        S["112 SKILL + 44 共享脚本"]
        O2["outputs/ 内容项目"]
    end
    W --> A --> P --> O
    C --> P
    O -->|cd 项目根| S --> O2
    G --> O2
和 Open Design 的亲缘 都是宿主:循环不是自己的。Open Design 接 25 个 CLI 做设计文件;Easel 接 1 个 OpenClaw 做国内六平台内容。卡片视觉还写在致谢里借鉴了 open-design。
Part 1 · 续

五层是写给模型看的分工,不是 Python 调度器

仓库里没有 WorkflowEngine。发现 9 / 策划 16 / 制作 50 / 发布 20 / 归因 11 / 基础 6,靠 SKILL.md 的 layer: 和跨层时的薄 manifest。单层任务直接做;跨两层以上才给短 Plan。

Skill 数磁盘上留下什么
discover9选题简报、热榜摘要
plan16brief.md、日历、大纲
produce50卡片 / 视频 / 文案成品
publish20真发 + publish-log
attribute11数据回流 memory.md

被否掉的方案写在注释里:全局 USER.md(并发互踩)、三入口各写各的超时、OpenClaw 默认 thinking=high(历史丢签名导致回放 400)。宿主的工作就是把这些伤口包扎好。

Part 2

四个实验台:把源码逻辑拨给你看

下面不是示意图。LAB 01 按 docs/prompt-stack.md 装配;LAB 02 用 description 做路由(仓库里没有 Python 路由器);LAB 03 移植 output_paths.py 的泛名与层级规则;LAB 04 移植 content_guard.py 的 BLOCK / WARN 分级。

LAB 01 提示词四层栈 拨开关看哪些层进 OpenClaw 的上下文。常驻层(SOUL / AGENTS / CONTEXT)每轮都在;SKILL 被触发才加载;画像是消息前缀,不是全局 USER.md;TURN_REMINDER 只加在 Web 对话末尾。
SOUL.md 人格常驻 · 不写具体 skill 名
AGENTS.md 宪法先路由 · 先 cd 项目根 · 真产物才算完
CONTEXT.md 路径sync.sh 生成绝对路径
SKILL.md 被触发按需 · 脚本不进 prompt
画像前缀(消息内联)否掉了全局 USER.md
TURN_REMINDERWeb 对话末尾 · 抗指令衰减
常驻 system 按需 skill 每轮消息(近因)

LAB 02 Skill 路由(description 就是路由器) 输入一句创作者会说的话。匹配规则移植自 SKILL.md 的中文 description:精确命中 → 相邻边界 → 否则通用 social-content。仓库里没有 if intent == 的 Python 路由器。
LAB 03 outputs 路径门禁 移植 output_paths.py:内容必须 outputs/<人类可读主题>/文件;泛名(xhs / test / tmp / 主题)直接拒绝;_ 系统目录要显式允许。
LAB 04 出站闸门 BLOCK / WARN 移植 content_guard.py 的分级:密钥 / 内部域名 / 代理 IP / env 名 → exit 7 硬拦;「由 AI 生成」/ 模型名 → 只告警(论文解读可能是正文)。人设分数不在这里——那道闸永不阻断发布。
Part 3

读下去

实验台只覆盖四条承重规则。会话双锁、uuid5 钉死 transcript、thinking 自愈、SSE 断线不杀、小红书 SOP,都在全文里按 文件:行号 展开。

去哪得到什么
Easel 源码分析(20 章)动机 → 约束 → 被否方案 → 选择 → 代价 · 冻在 765f5a6
从零构建教程(15 步)跟着「做一条小红书并发出去」装配 minieasel
Open Design 解析站同一条「不写循环」路线的设计宿主对照